图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪音,模糊图像(噪音是图像中变化比较大的区域,也就是高频信息)。而高通滤波能够提取图像的边缘(边缘也是高频信息集中的区域)。
根据滤波器的不同又可以分为均值滤波,高斯加权滤波,中值滤波, 双边滤波。
均值滤波是将一个m*n(m, n为奇数)大小的kernel放在图像上,中间像素的值用kernel覆盖区域的像素平均值替代。平均滤波对高斯噪声的表现比较好,对椒盐噪声的表现比较差。
在进行均值滤波的时候要考虑需要对周围多少个像素取平均值,即确定核 的大小,通常情况下都是以当前像素点为中心,读行数和列数相等的一块区域内的所有像素点求平均。将计算得到的结果作为该点的像素。
当前像素点为226的位置,我们对其周围5x5区域内像素点求平均计算方法为:
新值=(197+25+106+156+159+149+40+107+5+71+163+198+226+223+156+222+37+68+233+157+75+193+250+2+42)/25
计算得到的新值即为226像素点位置的新的像素。其中均值滤波的核如下所示
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('lenaNoise.png')
cv_show("img",img)
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))
cv_show("blur",blur)
res = np.hstack((img,blur))
cv_show("res",res)
得到原图片和通过均值滤波之后的图片,有着比较明显的变化
在均值滤波中,其邻域内每个像素的权重都是一样的,在高斯滤波中,中心点的权重值加大,远离中心点的权重值减少,在此基础上计算邻域内各个像素值不同权重的和。
dst=cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
'''
dst为高斯滤波后得到的结果
src是需要处理的图像,
ksize是滤波卷积核。需要注意的是滤波核 的值必须是奇数
sigmaX是卷积在水平方向的标准差,或者X方向求导
sigmaY是卷积在垂直方向的标准差,或者说Y方向上
bordenType是边界类型
'''
# 高斯滤波
# 高斯模糊的卷积核里的数值是满足高斯分布,相当于更重视中间的
aussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('aussian', aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图片与进行高斯滤波处理后的图像
中值滤波就是将当前像素点及其邻域内的像素点排序后取中间值作为当前值的像素点。
中值滤波的处理过程为:将226像素点周期的8个像素点一起排序即5,37,40,68,107,198,223,223,226,所以226像素点的新 的像素值为107.
# 中值滤波
# 相当于用中值代替
median = cv2.medianBlur(img, 5) # 中值滤波
cv2.imshow('median', median)
cv2.waitKey(0)
cv2.destroyAllWindows()
得到原图像与中值滤波的图片
下面分别是均值、高斯、中值滤波处理的图片