图像的灰度线性变换是图像灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度,从而达到图像增强的目的。灰度映射通常是用灰度变换曲线来进行表示。通常来说,它是将图像的像素值通过指定的线性函数进行变换,以此来增强或者来减弱图像的灰度,灰度线性变换的函数就是常见的线性函数。
<强> 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,可以令图像实现完全反转的效果。对应的直方图也会发生相应的变化。 相应的程序试下如下: 当k=1.2, b=50时执行程序的效果如下: //实现图像的对数变,换作用是压缩图像较亮区域的动态范围//使用不同的方法实现图像的对数变换//基本公式为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//实现图像的灰度线性变化
# 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
OpenCV图像处理之常见的图像灰度变换