![fd864530af0bad3d06313eb66da078bd.png](https://i-blog.csdnimg.cn/blog_migrate/8a0a1ca66ac47f677b13fc4c8ad348d7.jpeg)
[toc]目录
一、常规滤波
- 低通
- 高通
- 带通
- 带阻
二、非局部均值滤波
三、维纳滤波
四、卡尔曼滤波
前言
所谓滤波,其实就是从混合在一起的诸多信号中提取出所需要的信号。
信号的分类:
- 确定型信号,可以表示为确定的时间函数,可确定其在任何时刻的量值。(具有确定的频谱);一般可通过低通、高通、带通、带阻等模拟滤波器或其他常规滤波算法实现。
- 随机信号,不能用确定的数学关系式描述,不能预测其未来任何瞬时值,其值的变化服从统计规律。(频谱不确定,功率谱确定);根据有用信号和干扰信号的功率谱设计滤波器——维纳滤波(Wiener Filtering)或卡尔曼滤波(Kalman Filter)。
一、常规滤波
在图像处理或者计算机应用中,在正式对图像爱那个进行分析处理前一般需要一个预处理的过程。预处理是对图像作一些诸如降维、降噪的操作,主要是为后续处理提供一个体积合适、只包含所需信息的图像,通常会用到一些滤波处理手法。滤波,实际上就是信号处理,而图像本身可以看作是一个二维信号,其中像素点灰度的高低代表信号的强弱。对应的高低频的意义:
高频:图像中灰度变化强烈的点,一般是轮廓或者是噪声。
低频:图像中平坦的,灰度变化不大的点,图像中的大部各区域。
而根据图像的高频与低频的特征,可以设计相应的高通和低通滤波器,高通滤波可以检测图像中尖锐、变化明显的地方,而低通滤波可以让图像变得光滑,滤除图像中的噪声、OpenCv中提供的低通滤波有线性的均值滤波器、高斯滤波器,非线性的双边滤波器、中值滤波器;高通滤波有基于Canny,Sobel算子的各种滤波。其实很多时候低通滤波和高通滤波其实是相互矛盾的,很多时候在边缘检测前需要通过低通滤波降噪,这里就需要调节参数在保证高频的边缘不丢失的前提下尽可能多的去处图像的噪点。
这里使用频域的高通和低通滤波。
- 低通
理想的低通滤波器的模版为:
其中,
def low_pass_filter(img, radius=100):
r = radius
rows, cols = img.shape
center = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols, 2), np.uint8)
x, y = np.ogrid[:rows, :cols]
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r * r
mask[mask_area] = 1
return mask
Butterworth低通滤波器为:
![149350b1b33266ace6a39d355340b6c7.png](https://i-blog.csdnimg.cn/blog_migrate/e839dbcc67c6491ac58055e21d2c4d34.png)
def Butterworth(src, d0, n, ftype):
template = np.zeros(src.shape, dtype=np.float32) # 构建滤波器
r, c = src.shape
for i in np.arange(r):
for j in np.arange(c):
distance = np.sqrt((i - r/2)**2 + (j - c/2)**2)
template[i, j] = 1/(1 + (distance/d0)**(2*n)) # Butterworth 滤波函数
template[i, j] = np.e ** (-1 * (distance**2 / (2 * d0**2))) # Gaussian滤波函数
if ftype == 'high':
template = 1 - template
return template
高斯低通滤波器:
![9dcd0dc9eab94bd57e7f331d2c23902a.png](https://i-blog.csdnimg.cn/blog_migrate/42f4f06075f265759ab9cace81f26581.png)
# 定义函数,高斯高/低通滤波模板
def Gaussian(src, d0, ftype):
template = np.zeros(src.shape, dtype=np.float32) # 构建滤波器
r, c = src.shape
for i in np.arange(r):
for j in np.arange(c):
distance = np.sqrt((i - r / 2) ** 2 + (j - c / 2) ** 2)
template[i, j] = np.e ** (-1 * (distance ** 2 / (2 * d0 ** 2))) # Gaussian滤波函数
if ftype == 'high':
template = 1 - template
return template
- 带通
- 带阻
def bandreject_filters(img, r_out=300, r_in=35):
rows, cols = img.shape
crow, ccol = int(rows / 2), int(cols / 2)
radius_out = r_out
radius_in = r_in
mask = np.zeros((rows, cols, 2), np.uint8)
center = [crow, ccol]
x, y = np.ogrid[:rows, :cols]
mask_area = np.logical_and(((x - center[0