织梦CMS - 轻松建站从此开始!

罗索

OpenCV 下面的图像亮度变换 Intensity transformation

jackyhwei 发布于 2010-04-20 13:17 点击:次 
亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、GAMMA值调节、直方图调整等等。下面给出两个例子说明如何改变图像的亮度、对比度以及如何进行图像的GAMMA值调节。
TAG:

亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、GAMMA值调节、直方图调整等等。下面给出两个例子说明如何改变图像的亮度、对比度以及如何进行图像的GAMMA值调节。
亮度变换的原理可以参考MATLAB中的函数 imadjust.m,下面给出一个例子说明如何进行亮度变换的。
在MATLAB窗口中键入:
 
>> imadjdemo;
 
进行亮度变换演示。调整“Intensity Transform”窗口中的曲线,可以对图像进行亮度变换,这里调整的参数是 gamma =1, X-方向是 [0,0.5],Y-方向是[0.5,1],得到的结果如下:
 
 中的亮度变换演示 Imadjdemo.m
在MATLAB中也可以用imadjust 来得到同样结果,我们先看看函数imadjust的说明,给出的英文已经翻译过来:
 
>>help imadjust
>> IMADJUST 调整图像的亮度值.
    J = IMADJUST(I,[LOW_IN HIGH_IN],[LOW_OUT HIGH_OUT],GAMMA) 将图像I 的亮度值映射到新的图像J中,使得在 LOW_IN 和 HIGH_IN 之间(即X-方向)的值映射到 LOW_OUT 和 HIGH_OUT (即Y-方向)之间。小于 LOW_IN 以及大于 HIGH_IN 的值被裁剪调。GAMMA 表示曲线的形状,该曲线描述I和J之间的关系。如果 GAMMA 小于1, 则映射的权重趋向更亮的输出,如果GAMMA 大于1,则映射趋向更暗的输出。如果省略GAMMA,则默认值为 1。
注意:如果 HIGH_OUT < LOW_OUT,则图像输出反转,即通常所说的负片。但是 LOW_IN 必须小于 HIGH_IN。
 
实际上图像的亮度和对比度调节就是一种亮度变换,可以直接调整 [LOW_IN, HIGH_IN] 和 [LOW_OUT, HIGH_OUT] 的数值来改变亮度以及对比度。这里不再叙述了,读者可以自行测试。
 
 上用imadjust实现图5 14的输出结果:
>>I = imread(‘rice.tif’);
>>J = imadjust(I,[0 0.5],[0.5 1]);  % X方向是在[0,0.5]之间,Y方向在[0.5,1]之间
>> imshow(I);
>> figure, imshow(J);
 
运行后得到如下结果:
      
下面我们编制在OpenCV 下面的程序,以实现图像的亮度变换:
 :imadjust.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. if(   low<0 && low>1 && high <0 && high>1&& 
  16. bottom<0 && bottom>1 && top<0 && top>1 && low>high) 
  17.         return -1; 
  18.     double low2 = low*255; 
  19.     double high2 = high*255; 
  20.     double bottom2 = bottom*255; 
  21.     double top2 = top*255; 
  22.     double err_in = high2 - low2; 
  23.     double err_out = top2 - bottom2; 
  24.   
  25.     int x,y; 
  26.     double val; 
  27.   
  28.     // intensity transform 
  29.     for( y = 0; y < src->height; y++) 
  30.     { 
  31.         for (x = 0; x < src->width; x++) 
  32.         { 
  33.             val = ((uchar*)(src->imageData + src->widthStep*y))[x]; 
  34.             val = pow((val - low2)/err_in, gamma) * err_out + bottom2; 
  35.             if(val>255) val=255; if(val<0) val=0; // Make sure src is in the range [low,high] 
  36.             ((uchar*)(dst->imageData + dst->widthStep*y))[x] = (uchar) val; 
  37.         } 
  38.     } 
  39.     return 0; 
  40.   
  41. int main( int argc, char** argv ) 
  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.   
  59.     cvDestroyWindow("src"); 
  60.     cvDestroyWindow("result"); 
  61.     cvReleaseImage( &src ); 
  62.     cvReleaseImage( &dst ); 
  63.     
  64.     return 0; 


 
如果输入的参数设置为:
[LOW_IN, HIGH_IN] = [0,1] 和 [LOW_OUT, HIGH_OUT] = [1,0]
那么得到输入图像的反转片,运行得到图像反转。

(hunnish)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9190.html]
本文出处:CSDN博客 作者:hunnish
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容