GuoXin Li's Blog

频率域高通低通滤波&同态滤波

字数统计: 1.9k阅读时长: 7 min
2020/10/23 Share

数字图像处理作业02

背景知识

空间域与频率域

空间域与频率域提供了观察图像的不同视角

  • 空间域中,数字图像f(x,y)即为一个定义在二维空间中的矩形区域上的离散函数

  • 如果将f(x,y)视为幅值变化(即空间域灰度值在平面空间的梯度——直观表现为衡量表征图像中灰度变化剧烈程度的指标)的二维信号——幅值变化即为灰度值的梯度。则可以通过某些变换手段(如傅立叶变换、离散余弦变化、小波变换等)在频域下对图像进行处理。

  • 比如在空间图像里不好找出噪声的模式,如果变换到频率域,则比较好找出噪声的模式(高频分量),并能更容易处理。

空间域:

图像像素组成的空间,其物理描述的是图像的灰度 分布函数

频率域:

以频率(即波数)为自变量的描述图像的特征,可以将一幅图像值元值在空间上的变化分解为具有不同振幅、空间频率和相位的简振函数的线性叠加,图像中各种频率成分的组成和分布称为空间频谱,其物理意义是图像的频率分布函数。这种对图像的频率特征进行分解、处理和分析称为频率域处理。

image-20201021140831977

频率域滤波的目的

  • 引起图像质量下降的噪声占频谱的高频段
  • 图像边缘占高频段
  • 图像主题或灰度缓变区域占低频段

在频率域研究图像的原因

  • 空间域复杂的问题转变为频谱上简单易于求解的问题
  • 滤波在频率域更为直观,可以解释空间域滤波的某些性质
  • 可以在频率域制定滤波器,做饭变换,然后在空间域使用结果滤波器作为空间域滤波器的指导

解决过程

  • 利用傅立叶变换将原问题转变为频域上解决
  • 应用反变换,将频域上的解转化为原问题的解

频率域的特征

  • 频谱的直流低频分量对应图像的平滑区域
  • 频谱的高频分量对应图像的边沿或变化剧烈区域
  • 外界叠加噪声对应于频率较高的部分
  • 恒定的干扰条纹对应频谱中的某些特征点

低通滤波

  • 构造一个低通滤波器,使得低频分量顺利通过,有效阻止高频分量
  • 低通滤波时一个牺牲图像清晰度为代价来减少干扰效果的修饰过程
  • 高通滤波与低通滤波作用相反,它使高频分量顺利通过,而削弱低通分量

image-20201021145937937

  • 低通滤波器类型
    • 理想低通滤波器:尖锐
    • 巴特沃思低通滤波器:处于理想和高斯滤波器之间
    • 高斯滤波器:平滑

低通滤波器应用实例:模糊,平滑等

  • 字符识别:通过模拟图像,桥接断裂字符的裂缝

    image-20201021151648193

  • 印刷和出版业:从一幅尖锐的原始图像产生平滑、柔和的外观,如减少人脸皮肤皱纹和小斑点

    image-20201021151701682

  • 处理卫星和航空图像:尽可能模糊细节,保留大的可识别特征

    image-20201021151718012

频率域锐化滤波器

图像的锐化可以通过高通滤波器过程实现,减弱傅立叶变换的低频成分,而不改变高频信息

是低通滤波的相反过程:

$H{hp}(u,v) = 1-H{lp}(u,v)$

高通滤波器类型

  • 理想高通滤波器:尖锐
  • 巴特沃思高通滤波器:处于理想和高斯滤波器之间
  • 高斯高通滤波器:平滑
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
import numpy as np
import matplotlib.pyplot as plt
import cv2
###################################################################
############### 进行频率域处理 #############
###################################################################

img = cv2.imread("fog.jpg",0)#读图
dft = cv2.dft(np.float64(img),flags = cv2.DFT_COMPLEX_OUTPUT)#设置输入格式为float32
dft_shift = np.fft.fftshift(dft)#低频分量中心化处理,方便观察

#设置振幅大小
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))

#打印输入图像
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('input'), plt.xticks([]), plt.yticks([])

#获取频谱图
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Frequency Domain'), plt.xticks([]), plt.yticks([])


#设置低通滤波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2) #中心位置
mask = np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1#设置矩形窗口遮罩,设为1,过滤高频

#掩膜图像和频谱图像乘积
f = dft_shift * mask

#傅里叶逆变换
ishift = np.fft.ifftshift(f)
iimg = cv2.idft(ishift)
res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])

#显示低通滤波处理图像
plt.subplot(223), plt.imshow(res, 'gray'), plt.title('low')
plt.axis('off')


f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)

#设置高通滤波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0 #设置矩形窗口遮罩,设为0,过滤低频

#傅里叶逆变换
ishift = np.fft.ifftshift(fshift)
himg = np.fft.ifft2(ishift)
himg = np.abs(himg)

#显示原始图像和高通滤波处理图像
plt.subplot(224), plt.imshow(himg, 'gray'), plt.title('high')
plt.axis('off')
plt.show()

image-20201023022624600

同态滤波

同态滤波是一种广泛于信号和图像处理的技术,将原本的信号经由非线性映射,转换到可以使用线性滤波器的不同域,做完运算后再映射回原始域。同态的性质就是保持相关的属性不变,而同态滤波的好处是将原本复杂的运算转为效能相同但相对简单的运算。这个概念在1960年代由Thomas Stockham,Alan V. Oppenheim和Ronald W. Schafer在麻省理工学院提出。——wiki

基本思想

把图像的灰度函数 f(x,y) 看作为入射光分量和反射光分量两部分组成

$f(x,y) = i(x,y) r(x,y)$

i(x,y):入射光,占据低频段

r(x,y):反射光——取决于物体的特性,物体的亮度特征主要取决于反射光,占据高频段

image-20201021161436906

image-20201021155933953

image-20201021161549234

image-20201021161615446

image-20201021161632876

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
import cv2
import numpy as np

def homomorphic_filter(src,d0 = 1,r1 = 0.5,rh=2,c=4,h=2.0,l=0.5):
gray = src.copy() #duplicate img
if len(src.shape) > 2:
gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #set image gray
gray = np.float64(gray)
print(gray)
rows,cols = gray.shape #get rows and columns of inputed pic

gray_fft = np.fft.fft2(gray) # two dimension fft
print(gray_fft)
gray_fftshift = np.fft.fftshift(gray_fft)
print(gray_fftshift)
'''
需要fftshift的原因:

1、经过fft变换后,数据的频率范围是从[0,fs]排列的。

2、而一般,我们在画图或者讨论的时候,是从[-fs/2,fs/2]的范围进行分析。

3、因此,需要将经过fft变换后的图像的[fs/2,fs]部分移动到[-fs/2,0]这个范围内。

而fftshift就是完成这个功能。

通常,如果想得到所见的中间是0频的图像,经过fft变换后,都要再经过fftshift。
'''

dst_fftshift = np.zeros_like(gray_fftshift) #产生0类似的零矩阵
# np.meshgrid: 矩阵化 np.arange: start,stop,step 'arange can solve remainder'
M,N = np.meshgrid(np.arange(-cols // 2,cols // 2),np.arange(-rows//2,rows//2))
D = np.sqrt(M ** 2 + N ** 2) #square result
Z = (rh - r1) * (1 - np.exp(-c * (D ** 2 / d0 ** 2))) + r1

#使用频率增强函数进行对原频域的分量进行处理
dst_fftshift = Z * gray_fftshift #对零矩阵进行Z处理,Z*原频域处理后的分量
dst_fftshift = (h - l) * dst_fftshift + l

dst_ifftshift = np.fft.ifftshift(dst_fftshift)
dst_ifft = np.fft.ifft2(dst_ifftshift)

#取实数部分
dst = np.real(dst_ifft)

#np.clip to clip bigger than 255
dst = np.uint8(np.clip(dst,0,255))
return dst


# main
if __name__ == '__main__':
#resize img
img = cv2.imread("preSny.jpg", cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (600,400))

img_new = homomorphic_filter(img)
result = np.hstack((img, img_new))

cv2.imshow("Contrast", result)

cv2.waitKey()
cv2.destroyAllWindows()

image-20201023012547066

CATALOG
  1. 1. 数字图像处理作业02
  2. 2. 背景知识
  3. 3. 空间域与频率域
  4. 4. 频率域滤波的目的
  5. 5. 在频率域研究图像的原因
  6. 6. 解决过程
  7. 7. 频率域的特征
  8. 8. 低通滤波
    1. 8.1. 低通滤波器应用实例:模糊,平滑等
    2. 8.2. 频率域锐化滤波器
  9. 9. 高通滤波器类型
  10. 10. 同态滤波