imadjust.cpp
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:2k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. /*
  4.   src and dst are grayscale, 8-bit images;
  5.   Default input value: 
  6.            [low, high] = [0,1];  X-Direction
  7.            [bottom, top] = [0,1]; Y-Direction
  8.            gamma ;
  9.   if adjust successfully, return 0, otherwise, return non-zero.
  10. */
  11. int ImageAdjust(IplImage* src, IplImage* dst, 
  12.      double low, double high,   // X方向:low and high are the intensities of src
  13.      double bottom, double top, // Y方向:mapped to bottom and top of dst
  14.      double gamma )
  15. {
  16. if(  low<0 && low>1 && high <0 && high>1&&
  17. bottom<0 && bottom>1 && top<0 && top>1 && low>high)
  18.         return -1;
  19.     double low2 = low*255;
  20.     double high2 = high*255;
  21.     double bottom2 = bottom*255;
  22.     double top2 = top*255;
  23.     double err_in = high2 - low2;
  24.     double err_out = top2 - bottom2;
  25.     int x,y;
  26.     double val;
  27.     // intensity transform
  28.     for( y = 0; y < src->height; y++)
  29.     {
  30.         for (x = 0; x < src->width; x++)
  31.         {
  32.             val = ((uchar*)(src->imageData + src->widthStep*y))[x]; 
  33.             val = pow((val - low2)/err_in, gamma) * err_out + bottom2;
  34.             if(val>255) val=255; if(val<0) val=0; // Make sure src is in the range [low,high]
  35.             ((uchar*)(dst->imageData + dst->widthStep*y))[x] = (uchar) val;
  36.         }
  37.     }
  38.     return 0;
  39. }
  40. int main( int argc, char** argv ) 
  41. {
  42.     IplImage *src = 0, *dst = 0;
  43.     
  44.     if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL)  // force to gray image
  45.         return -1;
  46.     
  47.     cvNamedWindow( "src", 1 );
  48.     cvNamedWindow( "result", 1 );
  49.     
  50.     // Image adjust
  51.     dst = cvCloneImage(src);
  52.     // 输入参数 [0,0.5] 和 [0.5,1], gamma=1
  53. if( ImageAdjust( src, dst, 0, 0.5, 0.5, 1, 1)!=0) return -1;
  54.     
  55.     cvShowImage( "src", src );
  56.     cvShowImage( "result", dst );
  57.     cvWaitKey(0);
  58.     cvDestroyWindow("src");
  59.     cvDestroyWindow("result");
  60.     cvReleaseImage( &src );
  61.     cvReleaseImage( &dst );
  62.     
  63.     return 0;
  64. }