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

亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、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  调整图像的亮度值.
      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  图像的亮度变换
>>>>>>>>>>>>>>>
#include  "cv.h"
#include  "highgui.h"

int  ImageAdjust(IplImage*  src,  IplImage*  dst,
                    double  low,  double  high,    //  X方向:low  and  high  are  the  intensities  of  src
                    double  bottom,  double  top,  //  Y方向:mapped  to  bottom  and  top  of  dst
                    double  gamma  )
{
if(    low<0  &&  low>1  &&  high  <0  &&  high>1&&
bottom<0  &&  bottom>1  &&  top<0  &&  top>1  &&  low>high)
              return  -1;
      double  low2  low*255;
      double  high2  high*255;
      double  bottom2  bottom*255;
      double  top2  top*255;
      double  err_in  high2  low2;
      double  err_out  top2  bottom2;
 
      int  x,y;
      double  val;
 
      //  intensity  transform
      for(  0;  src->height;  y++)
      {
              for  (x  0;  src->width;  x++)
              {
                      val  ((uchar*)(src->imageData  src->widthStep*y))[x];
                      val  pow((val  low2)/err_in,  gamma)  err_out  bottom2;
                      if(val>255)  val=255;  if(val<0)  val=0;  //  Make  sure  src  is  in  the  range  [low,high]
                      ((uchar*)(dst->imageData  dst->widthStep*y))[x]  (uchar)  val;
              }
      }
      return  0;
}
 
int  main(  int  argc,  char**  argv  )
{
      IplImage  *src  0,  *dst  0;
     
      if(  argc  !=  ||  (src=cvLoadImage(argv[1],  0))  ==  NULL)  //  force  to  gray  image
              return  -1;
     
      cvNamedWindow(  "src",  );
      cvNamedWindow(  "result",  );
     
      //  Image  adjust
      dst  cvCloneImage(src);
      //  输入参数  [0,0.5]  和  [0.5,1],  gamma=1
if(  ImageAdjust(  src,  dst,  0,  0.5,  0.5,  1,  1)!=0)  return  -1;
     
      cvShowImage(  "src",  src  );
      cvShowImage(  "result",  dst  );
      cvWaitKey(0);
 
      cvDestroyWindow("src");
      cvDestroyWindow("result");
      cvReleaseImage(  &src  );
      cvReleaseImage(  &dst  );
     
      return  0;
}
 
如果输入的参数设置为:
[LOW_IN,  HIGH_IN]  [0,1]  和  [LOW_OUT,  HIGH_OUT]  [1,0]

那么得到输入图像的反转片,运行得到图像反转。


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2009/01/02/1586395.html,如需转载请自行联系原作者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值