2. 图像平滑处理
也称模糊处理,常见用来减少图像上的噪点或者失真。
线性滤波
均值滤波(领域平均滤波)
方框滤波
高斯滤波
均值滤波
cv2.blur(src,ksize,dst,anchor,borderType)
src: 输入图像对象矩阵,可以为单通道或多通道
ksize:卷积核的大小,格式为(宽,高)
dst:输出图像矩阵,大小和数据类型都与src相同
anchor:卷积核锚点,默认(-1,-1)表示卷积核的中心位置
borderType:填充边界类型
对目标像素及周边像素取平均值后再填会目标像素来实现滤波目的的方法。
# 均值滤波 blur = cv.blur(img1, (3, 3)) ksize = (5, 5) blur = cv.blur(img1, ksize, cv.BORDER_DEFAULT)
方框滤波
cv2.boxFilter(src,ddepth,ksize,dst,anchor,normalize,borderType)
src: 输入图像对象矩阵
ddepth:数据格式,位深度
ksize:高斯卷积核的大小,格式为(宽,高)
dst:输出图像矩阵,大小和数据类型都与src相同
anchor:卷积核锚点,默认(-1,-1)表示卷积核的中心位置
normalize:是否归一化 (若卷积核3*5,归一化卷积核需要除以15)
borderType:填充边界类型
若归一化,等价于均值滤波
若不归一,即截断在255
# 方框滤波 blur = cv.boxFilter(img1, -1, (3, 5))
高斯滤波
高斯卷积核是一个近似服从高斯分布的矩阵,随着距离中心点的距离增加,其值变小。这样进行平滑处理时,图像矩阵中锚点处像素值权重大,边缘处像素值权重小。
下为一个3*3的高斯卷积核:
dst =cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)
src: 输入图像矩阵,可为单通道或多通道,多通道时分别对每个通道进行卷积
dst:输出图像矩阵,大小和数据类型都与src相同
ksize:高斯卷积核的大小,宽,高都为奇数,且可以不相同
sigmaX: 一维水平方向高斯卷积核的标准差
sigmaY: 一维垂直方向高斯卷积核的标准差,默认值为0,表示与sigmaX相同
borderType:填充边界类型
# 高斯滤波 dst = cv.GaussianBlur(img1, (3, 5), 1)
对于上面的高斯卷积核,可以由如下两个矩阵相乘进行构建,说明高斯核是可分离卷积核,因此高斯卷积操作可以分成先进行垂直方向的一维卷积,再进行一维水平方向卷积。
cv2.getGaussianKernel(ksize,sigma,ktype)
ksize:奇数,一维核长度
sigma:标准差
ktype:数据格式,应该为CV_32F 或者 CV_64F
# 先知道有这么个函数
非线性滤波
中值滤波
双边滤波
中值滤波
中值平滑也有核,但并不进行卷积计算,而是对核中所有像素值排序得到中间值,用该中间值来代替锚点值。中值平滑特别适合用来去除椒盐噪声。
cv2.medianBlur(src,ksize,dst)
src: 输入图像对象矩阵,可以为单通道或多通道
ksize:核的大小,格式为 3 # 注意不是(3,3)
dst:输出图像矩阵,大小和数据类型都与src相同
img_median = cv.medianBlur(img1, 3) ## 白点噪声都被平滑掉了
双边滤波
双边滤波在平滑的同时还能保持图像中物体的轮廓信息。
双边滤波在高斯平滑的基础上引入了灰度值相似性权重因子,所以在构建其卷积核核时,要同时考虑空间距离权重和灰度值相似性权重。
在进行卷积时,每个位置的邻域内,根据和锚点的距离d构建距离权重模板,根据和锚点灰度值差异r构建灰度值权重模板,结合两个模板生成该位置的卷积核。
dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
src: 输入图像对象矩阵,可以为单通道或多通道
d:用来计算卷积核的领域直径,如果d<=0,从sigmaSpace计算d
sigmaColor:颜色空间滤波器标准偏差值,决定多少差值之内的像素会被计算(构建灰度值模板)
sigmaSpace:坐标空间中滤波器标准偏差值。如果d>0,设置不起作用,否则根据它来计算d值(构建距离权重模板)
bilateralFilter = cv.bilateralFilter(img1, 0, 0.3, 20)
import numpy as np
np.hstack() # 矩阵进行水平连接
np.vstack() # 矩阵进行垂直连接
res = np.hstack((blur, dst, img_median, bilateralFilter)) # 均值, 高斯, 中值, 双边
3. 形态学
腐蚀 & 膨胀
消除噪声 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。 寻找图像中的明显的极大值区域或极小值区域。
1. 腐蚀
cv2.erode(img, kernel, iterations)
kernel:腐蚀操作的内核,默认是一个简单的3X3矩阵。也可以利用getStructuringElement()函数指明它的形状
iterations:腐蚀次数,省略是默认为1
进行腐蚀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最小相素值提取,并代替锚点位置的相素。
kernel = np.ones((5, 5), np.uint8); # 内核 np.ones((k,k), mp.uint8); erosion = cv.erode(img2, kernel, iterations = 1) plt.subplot(1, 2, 1), plt.imshow(img2) plt.subplot(1, 2, 2), plt.imshow(erosion) plt.show()
2. 膨胀
cv2.dilation(img, kernel, iterations)
进行膨胀操作时,将内核 B 划过图像,将内核 B 覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” 。
dilation = cv.dilate(erosion, kernel, iterations = 1) plt.subplot(1, 2, 1), plt.imshow(erosion) plt.subplot(1, 2, 2), plt.imshow(dilation) plt.show() ## 腐蚀完进行膨胀
3. 开运算
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
先腐蚀再膨胀,被用来去除噪声。
4. 闭运算
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
先膨胀再腐蚀,经常被用来填充前景物体中的小洞、小黑点。
opening = cv.morphologyEx(img, cv.MORPH_OPEN,kernel) # 开运算 closeing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel) # 闭运算
5. 形态学梯度
cv2.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
膨胀图与腐蚀图之差,dilate - erode
保留物体的边缘轮廓,凸显边缘
pie = img3.copy() # show('', pie) kernel = np.ones((5, 5), np.uint8) dilate = cv.dilate(pie, kernel, iterations = 5) erosion = cv.erode(pie, kernel, iterations = 5) res = np.hstack((dilate, erosion)) show('res', res)
gradient = cv.morphologyEx(pie, cv.MORPH_GRADIENT, kernel)
6. 顶帽
= 原始 - 开运算
tophat = cv.morphologyEx(img2, cv.MORPH_TOPHAT, kernel)
7. 黑帽
= 闭运算 - 原始
black = cv.morphologyEx(img2, cv.MORPH_BLACKHAT, kernel)