边缘和其他尖锐变化(如噪声)在图像的灰度级中主要处于傅里叶变换的高频部分. 因此, 平滑(模糊)可以通过衰减指定图像傅里叶变换中高频成分的范围来实现.
G(u, v) = H(u, v)F(u, v)
目标是选择一个滤波器变换函数H(u, v)
以衰减F(u, v)
的高频成分产生G(u, v)
.
-
理想低通滤波器
-
巴特沃斯低通滤波器
-
高斯低通滤波器
1. 理想低通滤波器
最简单的低通滤波器是"截断"傅里叶变换中所有高频成分, 这些成分处在距离变换原点的距离比指定距离D0要远得多的位置. 这种滤波器称为二维理想低通滤波器,
其变换函数为:
)
使用低通滤波器所得到的结果如下所示. 低通滤波器滤除了高频成分, 所以使得图像模糊. 由于理想低通滤波器的过度特性过于急峻, 所以会产生了振铃现象.
2. 巴特沃斯低通滤波器
同样的, D0表示通带的半径, 2表示的是巴特沃斯滤波器的次数. 随着次数的增加, 振铃现象会越来越明显.
3. 高斯低通滤波器
from builtins import *
import cv2
import numpy as np
import matplotlib.pyplot as plt
def butterworthPassFilter(image, d, n):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_port = tuple(map(lambda x: int((x-1)/2), image.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dist = sqrt((pa[0] - pb[0])**2 + (pa[1] - pb[1])**2)
return dist
dis = cal_distance(center_port, (i, j))
transform_matrix[i, j] = 1/((1+(d/(dis+0.00000001)))**n)
return transform_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
if __name__ == '__main__':
img = cv2.imread('../pic/apple.png', 0)
plt.subplot(121)
plt.axis("off")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(butterworthPassFilter(img, 10, 2), cmap="gray")
plt.show()
from builtins import *
import cv2
import numpy as np
import matplotlib.pyplot as plt
def GaussianLowPassFilter(image, d):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x: int((x-1)/2), image.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dist = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dist
dis = cal_distance(center_point, (i, j))
transform_matrix[i, j] = np.exp(-(dis**2)/(2*(d**2)))
return transform_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
if __name__ == '__main__':
img = cv2.imread('../pic/apple.png', 0)
plt.subplot(121)
plt.axis("off")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(GaussianLowPassFilter(img, 30), cmap="gray")
plt.show()
from builtins import *
import cv2
import numpy as np
import matplotlib.pyplot as plt
def GaussianHighPassFilter(image, d):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
def make_transform_matrix(d):
transform_matrix = np.zeros(image.shape)
center_point = tuple(map(lambda x: int((x-1)/2), image.shape))
for i in range(transform_matrix.shape[0]):
for j in range(transform_matrix.shape[1]):
def cal_distance(pa, pb):
from math import sqrt
dist = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
return dist
dis = cal_distance(center_point, (i, j))
transform_matrix[i, j] = 1-np.exp(-(dis**2)/(2*(d**2)))
return transform_matrix
d_matrix = make_transform_matrix(d)
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
return new_img
if __name__ == '__main__':
img = cv2.imread('../pic/apple.png', 0)
plt.subplot(121)
plt.axis("off")
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.imshow(GaussianHighPassFilter(img, 100), cmap="gray")
plt.show()