/main.c

https://github.com/ginrou/motion-deblur · C · 73 lines · 50 code · 16 blank · 7 comment · 6 complexity · ac35338a534fc90cca9a7eb8dc5dcd2b MD5 · raw file

  1. #include <stdio.h>
  2. #include <cv.h>
  3. #include <highgui.h>
  4. #include "pcg.h"
  5. #include "compressiveSensing.h"
  6. #include "motionDeblur.h"
  7. /*
  8. argv[1] : original image
  9. argv[2] : blurred image
  10. argv[3] : result
  11. */
  12. int main(int argc, char* argv[] ){
  13. IplImage *original = cvLoadImage( argv[1], CV_LOAD_IMAGE_GRAYSCALE);
  14. IplImage *buf = cvLoadImage( argv[2], CV_LOAD_IMAGE_GRAYSCALE);
  15. IplImage *captured;
  16. CvSize imgSize = cvSize( 320, 320 );
  17. int psfSize = 16;
  18. int psfSizeSquare = psfSize*psfSize;
  19. if( original->height == buf->height && original->width == buf->width ){
  20. captured = buf;
  21. }
  22. else{
  23. CvMat* psf = cvCreateMat( psfSize, psfSize , CV_32FC1);
  24. IplImage* tmp = cvCreateImage( cvSize( psfSize, psfSize), IPL_DEPTH_8U, 1);
  25. cvResize( buf, tmp, CV_INTER_AREA);
  26. cvConvert( tmp, psf );
  27. cvNormalize( psf, psf, 1.0, 0.0, CV_L1, NULL);
  28. captured = cvCreateImage( cvGetSize(original), IPL_DEPTH_8U, 1);
  29. cvFilter2D( original, captured, psf, cvPoint( -1, -1) );
  30. int piyo;
  31. cvSaveImage( "blurredLenna.png", captured, &piyo);
  32. }
  33. // motion deblurring
  34. MotionDBL *mdbl = createMotionDBLStruct( captured, cvSize( psfSize, psfSize ));
  35. solveMotionDeblurring(mdbl);
  36. IplImage *dst = cvCreateImage( cvGetSize(captured), IPL_DEPTH_8U, 1);
  37. cvConvertScale( mdbl->original, dst, 256.0, 0.0);
  38. cvSaveImage( argv[3], dst, 0);
  39. return 0;
  40. // debug for compressive sensing
  41. CSstruct* cs = createCPStructure( psfSizeSquare, imgSize.width*imgSize.height);
  42. printf("create struct done\n");
  43. packImageToCSStruct( original, captured, imgSize, cvSize(psfSize, psfSize), cs);
  44. solveCompressiveSensing( cs );
  45. IplImage* img = cvCreateImage( cvSize( psfSize, psfSize), IPL_DEPTH_8U, 1);
  46. double norm = cvNorm( cs->x, NULL, CV_L1, NULL);
  47. printf("norm = %e \n", norm);
  48. for( int h = 0; h < psfSize; ++h){
  49. for( int w = 0; w < psfSize; ++w){
  50. int idx = h * psfSize + w;
  51. CV_IMAGE_ELEM( img, uchar, h, w)
  52. = fabs ( CV_MAT_ELEM( *cs->x, double, idx, 0 ) * 25000.0 / norm);
  53. }
  54. }
  55. cvSaveImage( argv[3], img, 0);
  56. return 0;
  57. }