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,如需转载请自行联系原作者



相关文章
|
26天前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
34 4
|
6天前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
2月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
WK
|
2月前
|
编解码 计算机视觉 Python
如何在OpenCV中进行图像转换
在OpenCV中,图像转换涉及颜色空间变换、大小调整及类型转换等操作。常用函数如`cvtColor`可实现BGR到RGB、灰度图或HSV的转换;`resize`则用于调整图像分辨率。此外,通过`astype`或`convertScaleAbs`可改变图像数据类型。对于复杂的几何变换,如仿射或透视变换,则可利用`warpAffine`和`warpPerspective`函数实现。这些技术为图像处理提供了强大的工具。
WK
65 1
|
2月前
|
机器人 计算机视觉
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
巧用 OpenCV solvePnP() 函数完成由图像坐标系到机器人坐标系的转换(二维坐标系之间的转换)
48 2
|
4月前
|
计算机视觉
opencv之形态变换
opencv之形态变换
|
4月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
104 1
|
3月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
4月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
58 1
|
4月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
68 0
下一篇
无影云桌面