在进入滤波之前,相信大家都对于图像有所了解,一般的图像都是由RGB三通道组成。下面我们将介绍几种常见的滤波算法,平滑滤波、中值滤波以及高斯滤波。
平滑滤波
平滑滤波是一种低频增强的空间域滤波技术,其目的主要有两类:一是模糊处理,二是消除噪声。通过平滑滤波,可以有效地去除图像中的高频信号,如噪点、小尖峰和边缘细节,使图像整体显得更加平滑。
原理:利用窗口中像素的平均值来替换目标像素的值。
特点:算法简单,计算速度快,但可能会造成图像在一定程度上的模糊。
代码如下:
def smooth_filter(self):
img = cv2.imread(self.image_path)
kernel = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], dtype=np.float32)
kernel = kernel / np.sum(kernel) # 归一化内核 使得相加为1,保持图像的亮度不变
det = cv2.filter2D(img, -1, kernel) # 卷积操作
cv2.imshow("smooth_filter", det)
cv2.imshow("origin_img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
注意:其中有一个归一化内核的操作,也就是归一化卷积核,使得卷积核元素和为1。如果不归一化内核会导致图像亮度增大。具体效果如下:
可以发现,经过平滑滤波后图像出现整体平滑的效果,但是随之也带来了模糊。在最后一张图则是没有内核归一化,这就导致了像素值过大,到255,而三个通道255也就是白色了。
中值滤波
中值滤波是一种非线性的数字滤波技术,它通常用于去除图像或信号中的噪声。这种方法的基本原理是将图像或信号中的一点的值替换为该点邻域内所有值的中值。
原理:将窗口中的像素按照灰度值排序,然后取中间位置的像素值作为目标像素的值。
特点:在一定程度上可以克服线性滤波器所带来的图像模糊问题,较好地保留了图像的边缘信息,对椒盐噪声表现较好。
代码如下:
def middle_filter(self):
img = cv2.imread(self.image_path)
for i in range(2000):
x = np.random.randint(0, img.shape[0])
y = np.random.randint(0, img.shape[1])
img[x][y] = 255 # 增加噪点
blur = cv2.medianBlur(img,5)
cv2.imshow("img",img)
cv2.imshow("middle_filter", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
从中我们可以看出,在人为加入椒盐滤波后,中值滤波算法可以很好地去除这些椒盐噪点,相反,我们可以尝试思考一下,采用平滑滤波去平均的方法其实不好处理这些白色的噪点,会导致噪点在某个像素点领域时的亮度升高。所以椒盐滤波适用于处理明显椒盐噪点的情况。
高斯滤波
高斯滤波的基本原理是利用高斯函数对图像进行卷积操作,实现对图像的平滑和降噪。高斯函数是一种钟形曲线,具有中心对称性和单峰性。
原理:利用高斯分布函数对窗口中的像素进行加权平均来计算目标像素的值。
特点:能够有效地抑制噪声,且由于考虑了权重,可以克服边界效应。
代码如下:
def gaosi_blur(self):
img = cv2.imread(self.image_path)
for i in range(2000):
x = np.random.randint(0, img.shape[0])
y = np.random.randint(0, img.shape[1])
img[x][y] = 255 # 增加噪点
blur = cv2.GaussianBlur(img, (5,5), 0)
cv2.imshow("img", img)
cv2.imshow("middle_filter", blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
高斯滤波的实现方式主要有两种:
高斯滤波是一种高效且稳定的平滑算法,在图像处理与计算机视觉领域发挥着重要作用。高斯滤波在图像处理方面效果稳定且应用广泛。
通过介绍上面几种滤波算法,相信大家对图像滤波处理也有了一部分的了解。