数字图像处理

数字图像处理

图像复原与重建

对于一些周期性噪声,空间滤波器的效果不会很好,而且会比较麻烦。在前面的一篇中,我们提到了,除了空间域,我们还可以在频率域进行滤波。这种变换的基本思想是:在傅里叶变换中,周期噪声在对应于周期干扰的频率处显示为集中突发的能量。方法是通过一个选择性滤波器来分离噪声。

带阻滤波器属于选择性滤波,包括后面两种带通滤波器和陷波滤波器,也都是选择性滤波器。它们区别于上一篇里面的滤波器的地方在于,它们只关注处理特定的频带或小频矩形区域。

  • 如果某个频带中的频率被滤除,则称该频带滤波器为带阻滤波器
  • 如果某个频带中的频率被通过,则称该频带滤波器为带通滤波器
  • 小频率矩形区域处理中的滤波器称为陷波滤波器

带阻滤波器

理论

  • 理想带阻滤波器(IBRF)

  • 高斯带阻滤波器(GBRF)

  • 巴特沃斯带阻滤波器(BBRF)

其中 是频带中心, 是带宽, 是传递函数得到中心到频率矩形中点 的距离。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

def cal_distance(pa, pb):
from math import sqrt
dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
return dis


class Filter:

@classmethod
def generate_filter(cls, d, shape, *args, **kwargs):
# 这里要反过来 shape 的两个维度
transfer_matrix = np.zeros((shape[0], shape[1]))
center_point = tuple(map(lambda x: (x - 1) // 2, shape))
for i in range(transfer_matrix.shape[0]):
for j in range(transfer_matrix.shape[1]):
dist = cal_distance(center_point, (i, j))
transfer_matrix[i, j] = cls.get_one(d, dist, *args, **kwargs)
return transfer_matrix

@classmethod
def get_one(cls, d, dist, *args, **kwargs) -> float:
return 1


class BBRFFilter(Filter):

@classmethod
def get_one(cls, d, dist, *args, **kwargs) -> float:
w = kwargs["w"]
n = kwargs["n"]
if dist == d:
return 0
else:
return 1 / (1 + ((dist * w) / (dist ** 2 - d ** 2)) ** (2 * n))


class GBRFFilter(Filter):

@classmethod
def get_one(cls, d, dist, *args, **kwargs) -> float:
w = kwargs["w"]
return 1-np.exp(-((dist ** 2 - d ** 2) / (d * w)) ** 2)


class IBRFFilter(Filter):

@classmethod
def get_one(cls, d, dist, *args, **kwargs) -> float:
w = kwargs["w"]
if d - w / 2 <= dist <= d + w / 2:
return 0
else:
return 1


def abs_threshold_filter(matrix):
matrix = np.abs(matrix)
return matrix


choice = "material/windmill_noise.png"
img = Image.open(choice).convert("L")
f = np.fft.fft2(img)
f_shift = np.fft.fftshift(f)
choices = {
"巴特沃斯带阻": BBRFFilter.generate_filter(15, (img.size[1], img.size[0]), n=3, w=5),
"高斯带阻": GBRFFilter.generate_filter(15, (img.size[1], img.size[0]), w=5),
"理想带阻": IBRFFilter.generate_filter(15, (img.size[1], img.size[0]), w=5)
}
for k, v in choices.items():
filter_matrix = v
transform_img = np.abs(np.fft.ifft2(np.fft.ifftshift(f_shift*filter_matrix)))

plt.imshow(transform_img, cmap="gray")
plt.axis("off")
plt.savefig("{}.png".format(k))
plt.clf()

下面是代码的运行结果,左边的是滤波后的图片,右边的是原图片(带有周期性噪声)。整体来看,高斯滤波效果看起来最差,周期性的黑白条纹没有完全消除。巴特沃斯方法得到的效果看起来更好,基本消除了黑白条纹噪声。

  • 巴特沃斯带阻滤波
  • 理想带阻滤波
  • 高斯带阻滤波

带通滤波器

陷波滤波器

自适应中值法

Author

Ctwo

Posted on

2021-05-08

Updated on

2021-05-25

Licensed under

Comments