代码语言:javascript复制
import cv2
o=cv2.imread("C:/Users/xpp/Desktop/Lena.png")#原始图像
r3=cv2.blur(o,(3,3))#使用3x3卷积核的均值滤波
r5=cv2.blur(o,(5,5))#使用5x5卷积核的均值滤波
cv2.imshow("original",o)
cv2.imshow("result3",r3)
cv2.imshow("result5",r5)
cv2.waitKey()
cv2.destroyAllWindows()
算法:均值滤波是用当前像素点周围像素点的均值来代替当前像素值。该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
- 首先考虑需要对周围多少个像素点取均值
- 对于边缘像素点,取图像内存在的周围邻域点的像素值均值或者扩展当前图像的周围像素点
- 每一个像素点都与内部值1/(ksize)的矩阵相乘,得到均值滤波结果
dst=cv2.blur(src, ksize, anchor, borderType)
- dst表示返回值,即均值滤波后得到的结果,可选参数
- src表示输入图像,图像深度为CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
- ksize表示滤波核大小,即邻域图像的高度和宽度
- anchor表示锚点,即均值均值滤波的均值的点位于核的中心点位置,可选参数
- borderType表示边界样式,可选参数
例子:
当锚点位于图像中心
data=[(197 25 106 156 159) (149 40 107 5 71) (163 198 226 223 156) (222 37 68 193 157) (42 72 250 41 75)]/25=125.52≈126
当锚点位于图像左上角
方式1:不扩展边缘,3x3卷积核
data=[(23 158 140) (238 0 67) (199 197 25)]/9≈116.3≈116
方式2:扩展边缘,5x5卷积核
data=[(0 0 0 0 0) (0 0 0 0 0) (0 0 23 158 140) (0 0 238 0 67) (0 0 199 197 25)]/25=41.88≈42
注意:图像平滑伴随着图像模糊,卷积核越大,去噪效果越好,运算像素点越多,时间复杂度越大,图像失真越严重。