opencv学习第三天,今天学习一下灰度变换,我对图像不是太了解,我还特地学了一下灰度变换与像素的区别:
像素、灰度、RGB、分辨率_y_xxiii的博客-CSDN博客_像素值和rgb的关系
先来梳理一下不太懂的知识点:
1.关于cvtColor函数,cvtcolor()函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
OpenCV学习cvtColor函数_1_blue的博客-CSDN博客_cvtcolor
2.clone函数的用法,这是图像的深拷贝,相当于重新创建了一份一模一样的图像。适用于不想改变原图来进行操作:
opencv图像处理学习(六十一)——clone与copyto_光电的一只菜鸡的博客-CSDN博客_opencv clone
3.normalize归一化函数需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
归一化函数normalize详解_DP323的博客-CSDN博客_normalize
4.convertScaleAbs函数是一个位深转化函数,我暂时没有找到很满意的一个解释:
opencv convertScaleAbs函数原理_高祥xiang的博客-CSDN博客_convertscaleabs函数
灰度变换:
1.灰度反转
灰度反转的原理很简单,就是颠倒黑白的运算,处理后的效果看起来像是原图的底片,对于一个8bit的灰度图像,变换公式为:s=255-1-r;可以先看一下效果图:
#include"iostream"
#include"opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat image, image_gray, output_image;
image = imread("D:\\Backup\\Documents\\My Pictures\\1.jpg");
cvtColor(image, image_gray, COLOR_BGR2GRAY);//灰度化
imshow("image_gray", image_gray);
output_image = image_gray.clone();//复制灰度图像,便于修改
for(int i = 0;i(i,j) = 255 - image_gray.at(i,j);
}
imshow("output_image", output_image);
waitKey(0);
return 0;
}
在我编完之后,又在其他地方看到可以只用"~"就可以实现灰度变换:
image = imread("D:\\Backup\\Documents\\My Pictures\\1234.jpg");
imshow("image",~image);
我都不用把图像灰度化,就可以实现图像反转。。。
2.对数变换
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:
x轴的0.4大约对应了y轴的0.8,即原图上0~0.4的低灰度部分经过对数运算后扩展到0~0.8的部分,而整个0.4~1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。
从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。
opencv代码如下:
#include"iostream"
#include"opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat image, image_gray, output_image;//定义输入,输出,灰度图像
image = imread("D:\\Backup\\Documents\\My Pictures\\1234.jpg");
cvtColor(image, image_gray, COLOR_BGR2GRAY);//灰度化
imshow("image_gray",image_gray);
output_image = image_gray.clone();//复制灰度图像,便于修改
for(int i = 0;i(i,j) =6*log((double)(image_gray.at(i,j))+1);
}
normalize(output_image, output_image, 0, 255, NORM_MINMAX);//图像归一化,转到0-255范围内
convertScaleAbs(output_image,output_image);//数据类型转换到CV_8U
imshow("output_image", output_image);
waitKey(0);
return 0;
}
效果图为:
3.伽马变换
伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:
代码如下:
output_image.at(i,j) =6*pow((double)image_gray.at(i,j),0.5);
结果如下:
我觉得感觉图像处理不明显,又找了一下资料,换了张图:
关于图像处理的应用我参考了下面的文章:
基础概念扫盲(六):灰度变换 - 知乎
今天就到这里了,感觉也没有很多内容,有些东西也没太懂,但是我消耗的时间也挺长的。 我写博客更多的是一种记录学习过程,我之前学了什么,有什么样的心路历程。加油!