Python-初学openCV——图像预处理(七)——亮度变换、形态学变换
目录
一、图像亮度变换
1、亮度变换
2、线性变换
3、直接像素值修改
二、形态学变换
1、核
2、腐蚀
3、膨胀
三、高级形态学变换
1、开运算
2、闭运算
3、礼帽运算
4、黑帽运算
5、形态学梯度
一、图像亮度变换
图像都是由一个个像素值组成的,图像的亮度变换实际上还是图像像素值的变换
1、亮度变换
对比度调整:图像暗处像素强度变低,图像亮处像素强度变高,从而拉大中间某个区域范围的显示精度。
亮度调整:图像像素强度整体变高或者变低
OpenCV调整图像对比度和亮度时,公式为:。但是不能浅显的讲
是控制对比度,
是控制亮度的。
对比度:需要通过、
一起控制。
亮度:通过控制。
2、线性变换
使用 cv2.addWeighted()
函数,可以对图像的像素值进行加权平均,进而改变图像的整体亮度。亮度增益可以通过向每个像素值添加一个正值来实现
cv2.addWeighted(src1, alpha, src2, beta, gamma)
src1:第一张输入图片
alpha:第一张图片的权重
src2:第二张输入图片
beta:第二张图片的权重
gamma:一个标量,将被添加到权重求和的结果上,可用于调整总体亮度
3、直接像素值修改
如果只需要增加或减少固定的亮度值,可以直接遍历图像像素并对每个像素值进行加减操作
numpy.clip(a, a_min, a_max)
a:输入数组
a_min:指定最小值,数组中所有小于a_min 的元素将被替换为 a_min
a_max:指定最大值,数组中所有大于a_max 的元素将被替换为 a_max
(用于对数组中的元素进行限定,将超出指定范围的元素值截断至指定的最小值和最大值之间)
二、形态学变换
一种基于形状的简单变换,它的处理对象通常是二值化图像。形态学变换有两个输入,一个输出:输入为原图像、核(结构化元素),输出为形态学变换后的图像。其基本操作有腐蚀和膨胀,这两种操作是相反的,即较亮的像素会被腐蚀和膨胀
1、核
核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构
示例:(一个5x5的全1数组)
2、腐蚀
腐蚀操作就是使用核在原图(二值化图)上从图像的左上角开始,滑动到图像的右下角。在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最小值,该最小值就是卷积核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在被核值为1覆盖的区域内,只要有黑色(像素值为0),那么该区域的中心像素点必定为黑色(0)。这样做的结果就是会将二值化图像中的白色部分尽可能的压缩
erosion=cv.erode(car,kernel,iterations=1)
iterations:迭代次数
3、膨胀
也就是从图像的左上角开始,滑动到图像的右下角,但与腐蚀恰恰相反,在滑动过程中,令核值为1的区域与被核覆盖的对应区域进行相乘,得到其最大值,该最大值就是核覆盖区域的中心像素点的新像素值,接着继续滑动。由于操作图像为二值图,所以不是黑就是白,这就意味着,在卷积核覆盖的区域内,只要有白色(像素值为255),那么该区域的中心像素点必定为白色(255)。这样做的结果就是会将二值化图像中的白色部分尽可能的扩张
dilation=cv.dilate(car,kernel,iterations=1)
三、高级形态学变换
常用于图像的噪声去除、边缘提取、图像闭合/开口等操作
cv2.morphologyEx(src, op, kernel)
src:输入二值图像
op:操作类型(如下)
kernel:核(结构元素)
iterations(可选):迭代次数
1、开运算
开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像
2、闭运算
闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域
3、礼帽运算
礼帽运算用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用礼帽运算进行背景提取(原图与开运算结果图之差)
4、黑帽运算
黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。黑帽运算用来分离比邻近点暗一些的斑块(原图与闭运算结果图之差)
5、形态学梯度
形态学梯度是一个基于结构元素的图像处理方法,它通过比较原图像与膨胀图和腐蚀图之间的差异来突出图像边缘特征。具体来说,对于图像中的每个像素点,其形态学梯度值是该像素点在膨胀后的图像值与其在腐蚀后的图像值之差。这样得到的结果通常能够强化图像的边缘信息,并且对噪声有一定的抑制作用