概念说明
观察图像中这些变化的频率就构成了另一条分类图像的方法。这个观点称为频域。而通过观察图像灰度分布来分类图像称为空间域。
频域分析将图像分成从低频到高频的不同部分。低频对应图像强度变化小的区域,而高频是图像强度变化非常大的区域。目前已存在若干转换方法,如傅立叶变换或余弦变换,可以用来清晰的显示图像的频率内容。注意,由于图像是一个二维实体,所以其由水平频率(水平方向的变化)和竖直频率(竖直方向的变化)共同组成。
在频率分析领域的框架中,滤波器是一个用来增强图像中某个波段或频率并阻塞(或降低)其他频率波段的操作。低通滤波器是消除图像中高频部分,但保留低频部分。高通滤波器消除低频部分
基础算法
用低通滤波来平滑图像
低通滤波器的目标是降低图像的变化率。如将每个像素替换为该像素周围像素的均值。这样就可以平滑并替代那些强度变化明显的区域。
高斯模糊
在某些情况下,需要对一个像素的周围的像素给予更多的重视。因此,可通过分配权重来重新计算这些周围点的值。这可通过高斯函数(钟形函数,即喇叭形数)的权重方案来解决。
区别
低通滤波与高斯滤波的不同之处在于:低通滤波中,滤波器中每个像素的权重是相同的,即滤波器是线性的。而高斯滤波器中像素的权重与其距中心像素的距离成比例。
使用中值滤波消除噪点
前面介绍的是线性过滤器,这里介绍非线性过滤器——中值滤波器。中值滤波器对消除椒盐现象特别有用。
双边滤波(Bilateral filter)
是一种可以保边去噪的滤波器。之所以可以达到此去噪效果,是因为滤波器是由两个函数构成。一个函数是由几何空间距离决定滤波器系数。另一个由像素差值决定滤波器系数。
代码
import cv2
import numpy as np
img = cv2.imread("test.jpg")
#低通滤波
result_1 = cv2.blur(img,(5,5)) #低通滤波。参数一是输入的待处理图像,参数2是低通滤波器的大小
cv2.imshow("blur",result_1)
#高斯模糊
gaussianResult = cv2.GaussianBlur(img,(5,5),1.5)
cv2.imshow("Gaussian",gaussianResult)
#中通滤波
def salt(img,n): #椒盐噪声
for k in range(n):
i = int(np.random.random() * img.shape[1]) #随机设置噪声点的坐标
j = int(np.random.random() * img.shape[0])
if img.ndim == 2: #
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0] = 255
img[j, i, 1] = 255
img[j, i, 2] = 255
return img
salted = salt(img,500)
cv2.imshow("Salt",salted)
result_2 = cv2.medianBlur(img,5) #中通滤波。第一个参数是待处理图像,第二个参数是孔径的尺寸,一个大于1的奇数
cv2.imshow("MedianBlur",result_2)
#双边滤波
blur_2=cv2.bilateralFilter(img,9,75,75)
cv2.imshow("bilateralFilter",blur_2)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考:
【1】http://blog.youkuaiyun.com/sunny2038/article/details/9155893