OpenCV图像处理之常见的图像灰度变换

  

  

图像的灰度线性变换是图像灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度,从而达到图像增强的目的。灰度映射通常是用灰度变换曲线来进行表示。通常来说,它是将图像的像素值通过指定的线性函数进行变换,以此来增强或者来减弱图像的灰度,灰度线性变换的函数就是常见的线性函数。

  

<强> g (x, y)=k·f (x, y) + d

  

设源图像的灰度值为x,则进行灰度线性变换后的灰度值为y=kx + b (0 & lt;=y<=255),下面分别来讨论k的取值变化时线性变换的不同效果

  k

(1) | |在1时

  

当k> 1时,可以用来增加图像的对比度,图像的像素值在进行变换后全部都线性方法,增强了整体的显示效果,且经过这种变换后,图像的整体对比度明显增大,在灰度图中的体现就是变换后的灰度图明显被拉伸了。

  k

(2)。| |=1时

  

当k=1时,这种情况下常用来调节图像的亮度,亮度的调节就是让图像的各个像素值都增加或是减少一定量。在这种情况下可以通过改变d值来达到增加或者是减少图像亮度的目的。因为当k=1,只改变d值时,只有图像的亮度被改变了,d> 0时,变换曲线整体发生上移,图像的亮度增加,对应的直方图整体向右侧移动,d<0时,变换曲线整体下移,图像的亮度降低,对应的直方图发生水平左移。

  

(3) .0   

此时变换的效果正好与k> 1时相反,即图像的整体对比度和效果都被削减了,对应的直方图会被集中在一段区域上同意值越小,图像的灰度分布也就越窄,图像看起来也就显得越是灰暗。

  

(4) .k<0时

  

在这种情况下,源图像的灰度会发生反转,也就是原图像中较亮的区域会变暗,而较暗的区域将会变量。特别的,此时我们令k=1, d=255,可以令图像实现完全反转的效果。对应的直方图也会发生相应的变化。

  

相应的程序试下如下:

     //实现图像的灰度线性变化   # include & lt; iostream>   # include & lt; opencv2 \ \ core.hpp>核心;   # include & lt; opencv2 \ highgui \ highgui.hpp>   # include & lt; opencv2 \ imgproc \ imgproc.hpp>      使用名称空间性病;   使用名称空间的简历;      int main ()   {   垫srcImg=imread (“1234. jpg”);   如果(! srcImg.data)   {   cout & lt; & lt;“读入图片失败”& lt; & lt;endl;   返回1;   }   imshow(“原图像”,srcImg);   双k b;   cout & lt; & lt;“请输入k和b值:“;   ,cin祝辞的在k在祝辞b;   int RowsNum=srcImg.rows;   int ColsNum=srcImg.cols;   垫dstImg (srcImg.size (), srcImg.type ());//进行遍历图像像素,对每个像素进行相应的线性变换   for (int i=0;我& lt;RowsNum;我+ +)   {   for (int j=0;j & lt;ColsNum;j + +)   {//c为遍历图像的三个通道   for (int c=0;c & lt;3;c++)   {//使用在操作符,防止越界   dstImg.at (i, j) [c]=saturate_cast   (k * (srcImg.at (i, j) [c]) + b);      }   }   }   imshow(“线性变换后的图像”,dstImg);   waitKey ();   返回0;   }      

当k=1.2, b=50时执行程序的效果如下:

  

 OpenCV图像处理之常见的图像灰度变换“> <br/>
  </p>
  <p> </p>
  <p>对数变换的基本形式为</p>
  <p> <img src=//实现图像的对数变,换作用是压缩图像较亮区域的动态范围//使用不同的方法实现图像的对数变换//基本公式为y=堵塞(1 + r)   # include & lt; iostream>   # include & lt; opencv2 \ \ core.hpp>核心;   # include & lt; opencv2 \ highgui \ highgui.hpp>   # include & lt; opencv2 \ imgproc \ imgproc.hpp>      使用名称空间性病;   使用名称空间的简历;      int main ()   {   垫srcImage=imread (“1234. jpg”, 0);   如果(! srcImage.data)   {   cout & lt; & lt;“读入图片错误~”& lt; & lt;endl;   返回1;   }   双c;   cout & lt; & lt;“请输入常数c:”;   ,cin祝辞的在c;   垫srcImage1 (srcImage);   imshow(“原图像”,srcImage);   垫dstImage1 (srcImage.size (), srcImage.type ());   垫dstImage2=dstImage1.clone ();   垫dstImage3=dstImage1.clone ();//使用第一种方法进行对数变换,对图像整体进行操作//首先计算1 + r,注意,是对每一个像素点都进行加1操作   添加(srcImage标量(1.0),srcImage1);//转换为32位的浮点数   srcImage1。convertTo (srcImage1 CV_32F);//计算日志(1 + r)   日志(srcImage1 dstImage1);   dstImage1=c * dstImage1;//进行归一化处理   正常化(dstImage1 dstImage1 0、255、NORM_MINMAX);//convertScaleAbs:先缩放元素再取绝对值,最后转换格式为8位型//在这里不具有缩放功能,作用仅为将格式转换为8位型   convertScaleAbs (dstImage1 dstImage1);   imshow(“对数变换图像1”,dstImage1);///////////////////////////////////////////////////////////////使用第二种方法进行图像的对数变换,对图像的像素进行遍历   双temp=0.0;   for (int i=0;我& lt;srcImage.rows;我+ +)   {   for (int j=0;j & lt;srcImage.cols;j + +)   {   temp=(双)srcImage.at

OpenCV图像处理之常见的图像灰度变换