图像平滑处理
案例© Fu Xianjun. All Rights Reserved.
图像平滑处理的基本原理是,将噪声所在像素点的像素值处理为其周围临近像素点的值的近似值。取近似值的方式很多,本文介绍:均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波。
读取原图:
import cv2
img = cv2.imread("peppa_salt.jpg")
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
均值滤波:
通常情况下,对于锚点anchor和边界样式borderType,直接采用其默认值即可。
dst = cv2.blur(src,ksize)
dst:输出图
src:输入图
ksize:滤波核的大小(这里以(7,7)为例)
blur = cv2.blur(img, (7, 7))
效果图:
方框滤波:
通常情况下,对于参数anchor、normalize、borderType,直接采用其默认值即可。
dst = cv2.boxFilter(src,ddepth,ksize)
dst:输出图
src:输入图
ddepth:dst的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
ksize:滤波核的大小(这里以(7,7)为例)
box = cv2.boxFilter(img,-1,(7,7))
效果图:
高斯滤波:
官方文档建议显式地指定ksize、sigmaX、sigmaY三个参数的值,以避免将来函数修改后可能造成的语法错误。当然,在实际处理中,可以显式指定sigmaX和sigmaY为默认值0
dst = cv2.GaussianBlur(src,ksize,0,0)
dst:输出图
src:输入图
ksize:滤波核的大小(这里以(7,7)为例)
sigmaX:卷积核在水平方向上(X轴方向)的标准差,控制的是权重比例
sigmaY:卷积核在垂直方向上(Y轴方向)的标准差。如果将该值设置为0,则只采用sigmaX的值;如果sigmaX和sigmaY都是0,则通过ksize.width和ksize.height计算得到
gaussian = cv2.GaussianBlur(img, (7, 7), 0, 0)
效果图:
中值滤波:
dst = cv2.medianBlur(src,ksize)
dst:输出图
src:输入图
ksize:滤波核的大小(必须比1大的奇数,比如3、5、7等)
median = cv2.medianBlur(img, 7)
效果图:
双边滤波:
dst = cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace,borderType)
dst:输出图
src:输入图
d:当前像素点为中心点的直径
sigmaColor:滤波处理时选取的颜色差值范围
sigmaSpace:坐标空间中的sigma值
borderType:边界样式
bilater=cv2.bilateralFilter(img,9,75,75)
效果图:
可以修改其中参数来得到更直观的五个函数之间的差异。