原文:https://blog.csdn.net/saltriver/article/details/78883904
前面提到,我们想到了用平均操作来降低噪声。降低噪声的意义是显而易见的,当我们需要图像增强,以提升图像的质量时,必须降低甚至消除噪声。
用平均操作来降低噪声是一种好方法,其基于的原理是:每个像素点的值与其周边像素点的值比较接近。
但是,我们进一步分析,如果一个像素点的值没有被噪声污染,那么用这种操作就改变了像素点的真实值,带来了副作用。同时,在像素点的8领域周边像素中,其水平和垂直方向的4领域像素与中心像素的距离是1,而对角像素与中心像素的距离是根号2,距离中心像素更近的像素的值是不是与中心像素的值更接近呢,重要程度更高呢。同样,中心像素的值本身是不是有更大的可能性接近原始值呢,它本身的重要程度是不是也更高呢。
于是,我们很自然的就想到是不是不用绝对平均,而是用加权平均,重要程度高的赋予更高的权重,重要程度低的赋予较低的权重。例如下图所示:
中心点象素的权重是0.25,水平和垂直方向像素的权重是0.125,对角方向像素的权重是0.0625,当然,这些权重的和必须等于1。
我们用加权平均来看一看效果。下图是带有盐噪声的图像。
import cv2
import numpy as np
salt = cv2.imread("salt_lena.bmp", 0)
row, column = salt.shape
reduce = salt[:]
for x in range(1, row - 1):
for y in range(1, column - 1):
reduce[x, y] = 0.0625 * salt[x - 1, y - 1] + 0.125 * salt[x - 1, y] + 0.0625 * salt[x - 1, y + 1] + \
0.125 * salt[x, y - 1] + 0.25 * salt[x, y] + 0.125 * salt[x, y + 1] + \
0.0625 * salt[x + 1, y - 1] + 0.125 * salt[x + 1, y] + 0.0625 * salt[x + 1, y + 1]
cv2.imshow("reduce", reduce.astype("uint8"))
cv2.waitKey()
输出结果: