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


     
    2006年11月21日 20:53:00
    亮度变换是指图像在空域上的点运算,通常包括图像增强、亮度/对比度、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]
    那么得到输入图像的反转片,运行得到图像反转。

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1402420




     
  • 相关阅读:
    数据结构课后
    idea 使用java 链接sqlservice 2008
    超链接 a href 提交表单通过post方式
    课程主页之课程接口
    课程主页之课程表数据
    课程表分析
    课程前端简单页面
    前台的登录注册
    ORM常用字段及参数与查询 -刘
    Celery配置与使用
  • 原文地址:https://www.cnblogs.com/feisky/p/1586395.html
Copyright © 2020-2023  润新知