数字图像 第四章频率域处理

数字图像处理 第四章频率域滤波

引言

在上一章对空间域处理进行了学习,这一章是针对频率域进行的。这一章关键在于关注基本原理与数字图像之间的关系。频率域是指从函数的频率域出发来分析函数。

4.1背景知识

第三章我们介绍了空间滤波的相关知识,这一章我们还需要学习在图形滤波中如何应用傅里叶变换来进行图像处理。这一章我们将会对傅里叶变换打下基础,表示出图像处理特征与一些数学工具之间的关系。

4.2傅里叶级数

在以前的数学以及其他科目的学习中,我们已经学习到了傅里叶级数以及傅里叶变换。首先这是由法国伟大的数学家傅里叶发现并且发表的,后世的很多应用和理论研究都与这两个理论有很大的关系。正所谓有一句话,不会傅里叶你就寸步难行。他提出任何周期函数都可以表示为不同频率的正弦或者是余弦项的形式。傅里叶公式如下所示。
在这里插入图片描述

最起初傅里叶的概率被应用于热扩散领域,但是随着计算机的出现和FFT的发展,人们发现这些理论知识对现代电子或者通信都有着很大的帮助,也可以对实际信号进行处理。

4.2.1一维傅里叶变换

首先,先从一维的傅里叶进行分析,然后再映射到二维的傅里叶变换。
傅里叶会有一对变换对,有傅里叶变换以及傅里叶逆变换。

傅里叶变换:
在这里插入图片描述
傅里叶逆变换:
在这里插入图片描述

傅里叶变换认为一个周期函数(信号)包含多个频率分量,任意函数(信号)f(t)可通过多个周期函数(基函数)相加而合成。从物理角度理解傅里叶变换是以一组特殊的函数(三角函数)为正交基,对原函数进行线性变换,物理意义便是原函数在各组基函数的投影。
当然傅里叶变换还会有一些性质,因为主要是于信号系统有关的性质,在这里就不做过多介绍。比如有奇偶对称性质、虚实特等。其中还有可恢复性的采样定理:要以大于或者等于最大信号频率来采样,这样恢复出来的信号才不会重叠,不会造成混的现象。

4.2.2二维傅里叶变换

从一维傅里叶变换映射到二维傅里叶,二维傅里叶变换对。其二维连续傅里叶变换由以下两个表达式给出。
在这里插入图片描述
在这里插入图片描述

当然二维也是有取样定理,就是如果一个二维带限连续函数在u和v两个方向上由以大于该函数最高频率两倍的取样频率取样获得的样本表示,则没有信息丢失。

我们还要把混淆的概念扩展到图像方面,讨论一些图像取样与重取样有关的问题。因为我们不能对一个函数无限的取样,所以,正像在取样后的一维函数中所存在的那样,在数字图像中混淆总是存在的。
这里混淆主要分为两样,空间混淆和时间混淆。空间混淆是比较常见的,所以就主要介绍空间混淆,空间混淆主要由欠取样造成。且图像中空间混淆主要表现形式主要是因为人为引入的缺陷。如线状特征中的锯齿、为高光以及原图像中不存在的模式。
比较一下双线性、双三次内插。最近邻的性能,通过代码进行实验。

if __name__ == "__main__":
    img = cv2.imread('E:\\picture\\tupian.png')
    print('original shape', img.shape)
    width = int(img.shape[1] * 0.5)
    height = int(img.shape[0] * 0.5)
    dsize = (width, height)  # 第一个属性值为列数,第二个属性值为行数
    print('resize shape', resize.shape)
    fx = 2  # 列数变为原来的2倍
    fy = 2  # 行数变为原来的2倍
    resize = cv2.resize(img, dsize, interpolation=cv2.INTER_LINEAR)  # 双线性插值方式
    resize1 = cv2.resize(resize, dsize=None, fx=fx, fy=fy,         
    interpolation=cv2.INTER_NEAREST)  # 最邻插值方式
    resize2 = cv2.resize(resize, dsize=None, fx=fx, fy=fy, interpolation=cv2.INTER_LINEAR)
    cv2.imshow("orignal img", img)
    cv2.imshow("resize img",resize)
    cv2.imshow("resize1 img", resize1)
    cv2.imshow("resize2 img", resize2)
    cv2.waitKey(0)
    cv2.destoryAllWindows()

4.3傅里叶变换后的频谱图

通过傅里叶变换频谱图,我们会看到一些明暗不同的点,其实这些就是代表图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小。总的来讲,一般是梯度越大,所代表的亮度也越大,反之也是。所以我们可以知道如果一个图像的梯度很大,则其一定是越尖锐,边界比较分明。
通过傅里叶变换得到频谱图,可以就看出图像主要信息是低频信息,这是应当将中心移至中心。`

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图片
img = cv2.imread('E:\\picture\\tupian.png ', 0)

# 进行float32形式转换
float32_img = np.float32(img)

# 使用cv2.dft进行傅里叶变化
dft_img = cv2.dft(float32_img, flags=cv2.DFT_COMPLEX_OUTPUT)

# 使用np.fft.shiftfft()将变化后的图像的低频转移到中心位置
dft_img_ce = np.fft.fftshift(dft_img)

# 使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
# img_dft = 20 * np.log(cv2.magnitude(dft_img_ce[:, :, 0], dft_img_ce[:, :, 1]))
# 频谱未中心化
img_dft = 20 * np.log(cv2.magnitude(dft_img[:, :, 0], dft_img[:, :, 1]))
# 进行画图操作
plt.subplot(121) # 我是第一行第二列的第一个
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_dft, cmap='gray')
plt.show()

4.4频率域滤波基础

频率域的滤波技术是以如下处理为基础的,通过修改傅里叶变换以达到特殊目的,然后计算IDFT返回图像域。这里我们所用的变换的两个分量分别是变换的幅度和相角。

4.4.1低频与高频的有关知识

低频对应图像中灰度变换缓慢的,而高频则对应图像中灰度变换快速的。总的来讲,一般低频就是图像中平坦的,就像是图像的绝大部分,高频对应的是图像的边缘或者是边界,图像的轮廓或者是噪声。

4.4.2频率域滤波器的基本步骤

首先将图片读取成灰度图且转化为np.float32(),使用cv2.dft函数,使用np.fft.fftshift函数,然后定义掩模,生成的掩模中间为1周围为0,使用掩模与傅里叶变换函数想乘,运用np.fft.ifftshift将图像低频部分移动到原来的位置,然后再使用cv2.idft进行傅里叶的反变化,最后使用cv2.magnitude转化为空间域内。

4.4.3滤波器的设计以及实现

滤波器先从低通滤波器开始,一幅图像中的边缘和其他尖锐的灰度转变(噪声)对傅里叶变换的高频内容有贡献。因此,在频率域平滑可通过对高频的衰减来达到,也就是低通滤波器。
理想低通滤波器模板:
在这里插入图片描述

且计算公式如下
在这里插入图片描述
然后低通滤波器代码,可以通过上面步骤来得出。

# 低通滤波器
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 第一步读入图片
img = cv2.imread(' E:\\picture\\tupian.png', 0)# filepath
# 使用cv2.dft进行傅里叶变化
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
# 使用np.fft.fftshift将低频转移到图像中心
dft_center = np.fft.fftshift(dft)
# 定义掩模:生成的掩模中间为1周围为0
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) # 求得图像的中心点位置
mask = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1

# 将掩模与傅里叶变化后图像相乘,保留中间部分
mask_img = dft_center * mask

# 使用np.fft.ifftshift(将低频移动到原来的位置
img_idf = np.fft.ifftshift(mask_img)

# 使用cv2.idft进行傅里叶的反变化
img_idf = cv2.idft(img_idf)

# 使用cv2.magnitude转化为空间域内
img_idf = cv2.magnitude(img_idf[:, :, 0], img_idf[:, :, 1])

# 进行绘图操作
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_idf, cmap='gray')
plt.show()

高通滤波器与低通滤波器相反,高通模板在这里插入图片描述
计算公式在这里插入图片描述

# 实现高通滤波器
import cv2
import numpy as np
from matplotlib import pyplot as plt

#读取图像
img = cv2.imread(' E:\\picture\\tupian.png', 0) # filepath
#傅里叶变换
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
fshift = np.fft.fftshift(dft)
#设置高通滤波器
rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2) #中心位置
mask = np.ones((rows, cols, 2), np.uint8) # 低通滤波器这是np.zeros
mask[crow-30:crow+30, ccol-30:ccol+30] = 0 # 低通滤波器这就是1
#掩膜图像和频谱图像乘积
f = fshift * mask
#傅里叶逆变换
ishift = np.fft.ifftshift(f)
iimg = cv2.idft(ishift)
res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
#显示原始图像和高通滤波处理图像
plt.subplot(121), plt.imshow(img, 'gray')
plt.subplot(122), plt.imshow(res, 'gray')
plt.show()

可以比较低通和高通滤波器,相同点在于定义的掩模大小和图片大小相同,不同点在于低通滤波器中间为1,高通滤波器中间为0。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值