11.OpenCV的图像模糊
前言
??图像模糊也称平滑处理,它主要处理图像中与周围差异较大的点,将其像素值调整为与周围点像素近似的值,其目的主要是消除图像噪声和边缘。
一、均值滤波
??均值滤波是指以当前点为中心,用其周围NN个像素点的平均值来代替代替当前点的像素值。用于计算平均值的NN个点称为邻域,用于滤波计算的卷积核大小与邻域相同。 ??一个大小为3*3的邻域如图所示,则卷积核为: ??则中心点的均值滤波值=(125+129+130+134+253+127+125+133+131)÷9=143,143比253更接近周围的值。 ??OpenCV的cv2.blur()函数用于实现均值滤波。
dst = cv2.blur(src, ksize [,anchor [,borderType]])
dst为滤波结果图像
src为原图像
ksize为卷积核大小, 表示为(width,height), width和height通常设置为相同值, 且为正数和奇数
anchor为锚点, 默认值为(-1,-1), 表示锚点位于卷积核中心
borderType为边界值处理方式
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
img_blur_3 = cv2.blur(img, (3, 3))
cv2.imshow('Blur_3', img_blur_3)
img_blur_5 = cv2.blur(img, (5, 5))
cv2.imshow('Blur_5', img_blur_5)
img_blur_11 = cv2.blur(img, (11, 11))
cv2.imshow('Blur_11', img_blur_11)
img_blur_21 = cv2.blur(img, (21, 21))
cv2.imshow('Blur_21', img_blur_21)
cv2.waitKey(0)
cv2.destroyAllWindows()
二、高斯滤波
??高斯滤波与均值滤波略有不同,它按像素点与中心点的不同距离,赋予像素点不同的权重值,越靠近中心点权重值越大,越远离中心点权重值越小。根据权重值计算邻域内所有像素点的和,将和作为中心点的像素值。 ??OpenCV的cv2.GaussianBlur()函数用于实现高斯滤波。
dst = cv2.GaussianBlur(src, ksize, sigmax [,sigmay [,borderType]])
sigmaX为水平方向上的权值值
sigmaY为垂直方向上的权值值
??如果sigmaY=0,则令其等于sigmaX;如果sigmaX和sigmaY均为0,则按照下面的公式计算其值。
sigmaX = 0.3 * ((width - 1) * 0.5 - 1) + 0.8
sigmaY = 0.3 * ((height - 1) * 0.5 - 1) + 0.8
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
img_GaussianBlur_3 = cv2.GaussianBlur(img, (3, 3), 0, 0)
cv2.imshow('GaussianBlur_3', img_GaussianBlur_3)
img_GaussianBlur_5 = cv2.GaussianBlur(img, (5, 5), 0, 0)
cv2.imshow('GaussianBlur_5', img_GaussianBlur_5)
img_GaussianBlur_11 = cv2.GaussianBlur(img, (11, 11), 0, 0)
cv2.imshow('GaussianBlur_11', img_GaussianBlur_11)
img_GaussianBlur_21 = cv2.GaussianBlur(img, (21, 21), 0, 0)
cv2.imshow('GaussianBlur_21', img_GaussianBlur_21)
cv2.waitKey(0)
cv2.destroyAllWindows()
三、方框滤波
??方框滤波以均值滤波为基础,可选择是否对滤波结果归一化处理。如果选择进行归一化,则滤波结果为邻域内点的像素值之和的平均值,否则滤波结果为像素值之和。 ??OpenCV的 cv2.boxFilter()函数用于实现方框滤波。
dst = cv2.boxFilter(src, ddepth, ksize, [,anchor [,normalize [,borderType]]])
ddepth为目标图像的深度, 一般使用-1表示与原图像的深度一致
normalize为True(默认值)是执行归一化操作, 为False时不执行归一化操作
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
img_boxFilter_3_T = cv2.boxFilter(img, -1, (3, 3), normalize = True)
cv2.imshow('boxFilter_3_T', img_boxFilter_3_T)
img_boxFilter_3_F = cv2.boxFilter(img, -1, (3, 3), normalize = False)
cv2.imshow('boxFilter_3_F', img_boxFilter_3_F)
img_boxFilter_11_T = cv2.boxFilter(img, -1, (5, 5), normalize = True)
cv2.imshow('boxFilter_5_T', img_boxFilter_5_T)
img_boxFilter_11_F = cv2.boxFilter(img, -1, (5, 5), normalize = False)
cv2.imshow('boxFilter_5_F', img_boxFilter_5_F)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、中值滤波
??中值滤波将邻域内的所以像素值排序,取中间值作为邻域中心点的像素值。 ??OpenCV的 cv2.medianBlur()函数用于实现中值滤波。
dst = cv2.medianBlur(src, ksize)
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
img_medianBlur_3 = cv2.medianBlur(img, 3)
cv2.imshow('medianBlur_3', img_medianBlur_3)
img_medianBlur_5 = cv2.medianBlur(img, 5)
cv2.imshow('medianBlur_5', img_medianBlur_5)
img_medianBlur_11 = cv2.medianBlur(img, 11)
cv2.imshow('medianBlur_11', img_medianBlur_11)
img_medianBlur_21 = cv2.medianBlur(img, 21)
cv2.imshow('medianBlur_21', img_medianBlur_21)
cv2.waitKey(0)
cv2.destroyAllWindows()
五、双边滤波
??双边滤波在计算像素值的同时会考虑距离和色差的信息,从而可在消除噪声的同时保护边缘信息。在执行双边滤波操作时,如果像素点与当前点色差较小,则赋予其较大的权重值,否则赋予其较小的权重值。 ??OpenCV的cv2.bilateralFilter()函数用于实现双边滤波。
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace [,borderType])
d表示以当前点为中心的领域的直径, 一般为5
sigmaColor为双边滤波选择的色差范围
sigmaSpace为空间坐标中的sigma值, 值越大表示越多的像素点参与滤波计算,当d>0时, 忽略sigmaSpace, 由d决定邻域大小; 否则d由sigmaSpace计算得出, 与sigmaSpace成比例
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
img_bilateralFilter = cv2.bilateralFilter(img, 5, 100, 100)
cv2.imshow('bilateralFilter', img_bilateralFilter)
cv2.waitKey(0)
cv2.destroyAllWindows()
六、2D滤波
??均值滤波、高斯滤波、方框滤波、中值滤波和双边滤波等可以通过参数来确定卷积核,2D卷积可使用自定义的卷积核来执行滤波操作。 ??OpenCV的cv2.filter2D()函数用于实现2D滤波。
dst = cv2.filter2D(src, ddepth, kernel [,anchor [,delta [,borderType]]])
ddepth为目标图像的深度, 一般使用-1表示与原图像的深度一致
kernel表示单通道卷积核(一维数组)
anchor表示图像处理的锚点
delta表示修正值, 未省略时, 将加上该值作为最终滤波的结果
borderType表示边界值处理方式
img = cv2.imread('lena.jpg')
cv2.imshow('Lena',img)
k1 = np.array([[3,3,3,3,3], [3,9,9,9,3], [3,11,12,13,3], [3,8,8,8,3],[3,3,3,3,3]]) / 25
k2 = np.ones((5,5),np.float32) / 25
img_1_2D = cv2.filter2D(img, -1, k1)
cv2.imshow('img_1_2D', img_1_2D)
img_2_2D = cv2.filter2D(img, -1, k2)
cv2.imshow('img_2_2D', img_2_2D)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 总结
??以上内容介绍了OpenCV-Python中图像模糊基本操作,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’?’●)。
|