写在前面
DIP-Digital Image Processing-数字图像处理,是计算机图形学和计算机视觉的重要基础,本系列文章是根据“冈萨雷斯《数字图像处理》(第四版)”教材的顺序展开,解释数字图像处理中的重要知识点,同时也可作为期末复习笔记。
- 第一、二章 序论、数字图形基础
- 第三章 灰度变换与空间滤波
- 第四章 频率域滤波
- 第六章 彩色图像处理
- 第八章 图像编码基础
- 第十-十一-十二章 图像分割描述识别
- 上机作业
目录
前验知识
微积分、泰勒展式、傅里叶变换数学推导、反函数、傅里叶变换与傅里叶反变换的函数性质、卷积定理。
这些内容会在本章的原理剖析中有所涉及,但由于它们不是《数字图像处理》本身的内容,故不会在这里做介绍,仅专注于DIP本身的知识点和要领。
傅里叶变换
- 傅里叶变换:将图像从时域转到频率域;
- 傅里叶反变换:将图像从频率域转到时域。IFT (Inverse)
傅里叶变换必须满足采样定理。
- 一维采样定理:奈奎斯特定理:采样频率必须至少是信号在空间频率域中最高截止频率的两倍。
- 二维采样定理:如果图像信号的频率在空间频率域内是有限的,即其 Fourier 频谱在频率 (u,v) 方向上有截止频率
和
,则图像可以按满足采样间隔
和
的条件进行采样,否则离散正变换和反变换无法成对出现。
为什么需要傅里叶变换
傅里叶变换提供了一个不同的视角,将图像信息转换为频率信息,使得在频率域中可以更方便地进行滤波、降噪、压缩等操作。因此,频率域修改图像能够在保持或增强图像质量的同时,降低处理难度和计算量。
- 1. 更方便地分离和处理不同频率成分
- 图像包含高频分量(细节、边缘)和低频分量(平滑区域),在频率域中,它们被分开展示:低频成分靠近频谱中心,高频成分分布在边缘。
- 通过傅里叶变换,能够很容易地对不同频率成分进行处理。例如,去除高频噪声或增强高频成分来锐化图像,可以通过在频率域中对特定频率范围进行滤波实现。
- 2. 简化卷积操作,减少计算量
- 图像滤波的卷积运算在空间域中计算量较大,但根据卷积定理,卷积在频率域可以转化为简单的乘法。傅里叶变换将卷积操作简化为频率域中的乘法,再通过反傅里叶变换返回空间域。
- 这种转化特别适用于大图像和大型滤波器,能够显著减少计算复杂度和时间成本。
- 3. 方便构建和应用滤波器
- 在频率域中可以轻松设计不同的滤波器。例如,低通滤波器用于平滑图像,高通滤波器用于增强边缘和细节。
- 这些滤波器在频率域中具有明确的频率范围,可以更精确地控制图像的某些频率分量,而不影响其他部分。这种精确的控制在空间域较难实现。
- 4. 去除周期性噪声
- 图像可能受到周期性噪声的干扰,如扫描仪、数字传感器中电气干扰产生的噪声。在频率域中,这些噪声会呈现为某些特定的频率成分,可以通过频率域滤波轻松去除。
- 将图像转换到频率域,识别出这些干扰噪声的位置并去除,可以在不影响图像其他成分的前提下去除噪声。
- 5. 更适合进行图像的压缩
- 频率域的处理有助于去除冗余信息,使图像压缩更为高效。例如,JPEG压缩就是通过离散余弦变换(DCT,一种类似于傅里叶变换的方式)来去除人眼不敏感的高频成分,从而达到压缩目的。
- 在频率域中去掉一部分高频成分(如微小噪声和细节),可以减少数据量,同时保留图像的主要特征。
傅里叶波谱
低频成分靠近频谱中心,高频成分分布在边缘。
什么是频域
频域中的信息描述了图像的变化模式,而不是图像的具体像素值。通过傅里叶变换,图像被分解成不同频率的“波”,每个频率成分的强度(幅度)和位置(相位)可以表示图像的细节和整体特征:
- 低频成分:表示图像中变化缓慢的区域,比如大块的平滑区域或渐变区域。低频部分主要包含图像的轮廓和整体形状。
- 高频成分:表示图像中变化较快的细节,比如边缘、纹理、噪声等细小变化。高频部分主要包含图像的细节和边缘信息。
通过在频域中观察图像的频率分布,我们可以了解图像的主要结构和细节分布,而不需要具体的像素值。
频域中的信息是什么
在频域图像中,信息通常包含以下几个方面:
- 幅度信息:表示频率分量的强度。幅度较大的频率分量对图像的整体外观贡献较大。通过修改幅度,可以影响图像的对比度和亮度。在空间域中,振幅可以理解为像素的亮度或强度。
- 相位信息:表示频率分量的位置。相位信息对于图像的结构和位置非常重要。如果只保留图像的相位信息而忽略幅度信息,仍然可以看出图像的结构轮廓,这表明相位在图像重构中具有重要作用。空间域的相位决定了图像的结构和布局。
- 低频信息:表示图像的主要轮廓、背景或大面积的色调变化,通常对图像的整体结构贡献最大。
- 高频信息:表示图像的细节、纹理、边缘等,这些部分通常在图像中变化较快,是图像的细节信息来源。
假设有一幅图像,通过傅里叶变换得到振幅谱和相位谱。如果我们分别修改或保留其中一个信息并进行逆傅里叶变换,将会得到以下效果:
- 仅保留振幅,忽略相位:得到的图像会是一个模糊的版本,因为只有亮度和对比度信息,没有形状和边缘的结构。
-
仅保留相位,忽略振幅:得到的图像会呈现出原图的结构和形状,但亮度和对比度会丢失,看起来可能像是一个轮廓或阴影。
问
哪些区域像素值变化的慢(快)?
在这张图片中,像素值变化较慢的区域通常是那些颜色和亮度分布相对均匀的部分,即图像中变化平缓的区域(低频区域)。在这张花朵和叶子的图像中:
- 叶子区域:叶片部分的颜色和亮度变化相对平缓,主要是绿色的不同深浅,因此这些区域的像素值变化较慢。
- 花朵中心区域:花朵的中心部分,颜色相对均匀,变化也较慢。
相反,像素值变化较快的区域是边界较为明显、颜色或亮度急剧变化的部分,例如花瓣的红色边缘和黄色区域的过渡处。这些地方像素值变化显著,表现为图像中的高频分量。
为什么波谱呈如此分布
为什么低频在中心,高频在四周?
这种布局主要是为了方便观察而进行的频谱重排。在傅里叶变换的原始输出中,频率分量是按照“角频率”从左上角到右下角排列的,即左上角是最低频率(直流分量),往右和下逐渐增加频率。这种布局虽然符合傅里叶变换的数学输出,但在图像处理中不直观。
为了方便人类观察,我们通常会将傅里叶变换结果进行频谱中心化处理,将低频分量移到中心位置,高频分量移到四周。这种重排操作不会改变频域数据的本质,只是将频谱重新排列,使得我们可以更方便地观察图像的频率特性。
例
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
# 用于展示图像的函数
def show_image(img, title="Image", cmap_type='gray'):
plt.imshow(img, cmap=cmap_type)
plt.title(title)
plt.axis('off')
plt.show()
# 读取图像并将其转换为灰度图
img_path = r"\3.png"
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
# 将图像转换为浮点数类型并标准化
img = np.float32(img)
# 记录时间
start_time = time.time()
# (a) 乘以 (-1)^(x+y)
rows, cols = img.shape
x = np.arange(rows)
y = np.arange(cols)
X, Y = np.meshgrid(x, y, indexing='ij')
centered_img = img * ((-1) ** (X + Y))
# 记录中心化时间
center_time = time.time()
show_image(centered_img, "After Centering with (-1)^(x+y)")
print(f"Centering operation time: {center_time - start_time:.6f} seconds")
center_time = time.time() # 避免输出图像关闭不及时带来的极大误差,故此处重新记录当前项的时间。
# (b) 计算 DFT(傅里叶变换)
dft = cv2.dft(centered_img, flags=cv2.DFT_COMPLEX_OUTPUT) # 输出频域表示的复数数组,返回的结果是一个二维数组,其中每个元素都是复数,表示对应频率的幅值和相位信息。
dft_shift = np.fft.fftshift(dft) # 它重新排列傅里叶变换的输出,将低频成分移到频谱的中心,而高频成分移到四周。这样处理有助于更直观地分析频谱。
# 记录傅里叶变换时间
dft_time = time.time()
magnitude_spectrum = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
show_image(magnitude_spectrum, "Magnitude Spectrum of DFT")
print(f"DFT operation time: {dft_time - center_time:.6f} seconds")
dft_time = time.time()
# (c) 取复共轭 (conjugate)
conj_dft = np.zeros_like(dft_shift)
conj_dft[:, :, 0] = dft_shift[:, :, 0] # 实部
conj_dft[:, :, 1] = -dft_shift[:, :, 1] # 取虚部的相反数(复共轭)
# 记录复共轭操作时间
conjugate_time = time.time()
magnitude_spectrum_conj = 20 * np.log(cv2.magnitude(conj_dft[:, :, 0], conj_dft[:, :, 1]))
show_image(magnitude_spectrum_conj, "Magnitude Spectrum after Conjugate")
print(f"Conjugate operation time: {conjugate_time - dft_time:.6f} seconds")
conjugate_time = time.time()
# (d) 计算傅里叶反变换 IDFT
idft_shift = np.fft.ifftshift(conj_dft)
idft = cv2.idft(idft_shift)
# 记录傅里叶反变换时间
idft_time = time.time()
idft_real = idft[:, :, 0] # 实部
idft_imag = idft[:, :, 1] # 虚部
print(f"IDFT operation time: {idft_time - conjugate_time:.6f} seconds")
idft_time = time.time()
# (e) 再次乘以 (-1)^(x+y)
final_result = idft_real * ((-1) ** (X + Y))
# 记录最终图像操作时间
final_time = time.time()
show_image(final_result, "Final Result (Real Part with (-1)^(x+y))")
print(f"Final multiplication and result time: {final_time - idft_time:.6f} seconds")
原图:
将图像乘一个交错的正负矩阵,用于图像中心化(将低频成分移动至中心):
傅里叶变换:
取变换的复共轭(反转相位,在空间域中表现为上下反转)后傅里叶反变换:
还原结果(用正负交错的矩阵乘实部--去除傅里叶变换的虚数部分):
修改波谱
有时会在频率域中添加水印,这种水印是肉眼不可见的,但频域修改引入的不可逆性,不可能完全复原会原空间域中的图片,只能做到肉眼视觉上近似还原。
倘若遮住傅里叶波谱中心区域乃至90%的内容,任然可以复原回肉眼近似还原的空间域图片,因为低频成分主要代表图像的大致轮廓和整体亮度的变化,对于图像的精细结构和细节没有直接影响,也有一定的冗余性。因此,即使遮住了低频部分,图像依然可以保留清晰的边缘和细节信息,视觉效果上不会有过多的损失。且傅里叶变换在频率域具有对称性,即正负频率是对称分布的。因此,频谱中心(低频区域)被遮盖后,频谱的其余部分可以弥补一些缺失的信息,从而在反变换后仍能产生类似于原图的效果。
二维Fourier变换的性质
-
可分离性:
- 性质:二维傅里叶变换可以分解为对行和列分别进行一维傅里叶变换。
- 作用:便于计算,特别是应用快速傅里叶变换(FFT)时,可以提高计算效率。
-
线性:
- 性质:如果两个图像的傅里叶变换已知,则它们的线性组合的傅里叶变换就是各自傅里叶变换的线性组合。
- 作用:可以在频率域中叠加波,从而实现图像的叠加或者复合效果,简化空间域中的操作。
-
共轭对称性:
- 性质:对于实值图像,二维傅里叶变换的频谱是共轭对称的,即频域中对称位置上的复数是共轭的。
- 作用:利用对称性可以减少计算量,并且只需存储频域的一半数据即可。
- 傅立叶变换的逆变换,可以通过求其共轭运算的正变换复合得到。对于实值图像,傅里叶变换的共轭的傅里叶变换就是图像本身的傅里叶变换。
-
位移性:
- 性质:在空间域中平移图像,只会引起频域中相位的变化,而不影响幅值。
- 作用:图像的位移不会改变频域幅值(在空间域中表现为对比度和亮度),因此可以直接利用频谱特征来识别或检测图像内容,而不受平移的影响。
-
周期性:
- 性质:二维傅里叶变换和反变换的结果是周期性的,即频域中的图像会周期性地重复。
- 作用:有助于理解图像在频域中的重复特性,在图像处理时常用来实现无缝拼接和频谱边界的处理。
-
旋转性:
- 性质:空间域中图像的旋转会导致频域中相应的旋转。
- 作用:在频域中可以旋转傅里叶变换的结果来分析旋转不变特征,用于图像识别中的旋转不变性分析。下图公式采用极坐标形式
-
统计特性:
- 性质:图像的统计特性(如均值和方差)会在频率域中对应一些特定的频谱特征。图像的能量主要(对于大多数无明显颗粒噪音的图像来说:85%以上)集中在低频区域;图像中如果存在有明显的颗粒噪音,或明显的细节亮度跳跃变化,则变换后,高频数据增加,分布增多。
- 作用:通过频域中的统计特性,可以提取图像的特征用于图像分析和分类,例如检测纹理和图像的粗细特征。
问题模型
标量表达式:
矩阵表达式:
离散余弦变换DCT
从理论推导可知,余弦变换是一种“特殊的”傅立叶变换。
是g(x,y)的在[-N,N-1]×[-N,N-1]“子空间”上的傅立叶变换。
波谱特性
离散余弦变换(DCT)的频谱特性与傅里叶变换不同。
-
频率分布:在DCT的频谱中,默认情况下,低频分量集中在左上角,而高频分量则沿着右下角逐渐增加。这与离散傅里叶变换(DFT)的频谱不同,DFT通常是将低频分量集中在中心,高频分量位于四周。因此,DCT频谱在视觉上会有左上角低频、右下角高频的分布。
-
对称性:DCT的频谱不具备像傅里叶变换那样的共轭对称性。傅里叶变换的频谱由于包含复数,天然具备共轭对称性,这也使得DFT在频域中表现出对称结构。DCT的结果一般是实数,因此频谱图没有共轭对称的性质。
-
主要应用:DCT广泛应用于图像压缩(如JPEG),因为它能有效地将大多数信号能量集中在频谱的左上角低频区域,从而在压缩时可以丢弃更多的高频分量,而不会显著影响图像质量。这种特性使DCT特别适用于块状图像处理和压缩。
该图经过处理,低频分量集中在右下角,不是一般的默认情况。
沃什变换和哈达玛变换
可分离图像变换:
图像变换与变换核
滤波器
低通滤波器
用于保留图像中的低频成分,抑制高频成分。低频成分通常对应图像中的整体结构和光滑区域,因此低通滤波器常用于模糊和去噪处理。
高通滤波器
用于保留图像中的高频成分,抑制低频成分。高频成分通常对应图像中的边缘和细节,因此高通滤波器常用于边缘检测和锐化处理。
确定最少滤波次数
在进行多次滤波时,可以通过以下方式确定最少的滤波次数:
- 观察频谱:在每次滤波操作后,查看频谱的变化情况。通常可以通过频谱图来判断高频或低频成分的削弱程度。
- 图像观察:在每次滤波后查看图像,如果细节肉眼观察已经不再变化,可以认为已经达到合适的滤波次数。
低通滤波器和高通滤波器的关系
低通滤波器和高通滤波器互为互补,任何图像都可以通过低频部分和高频部分的叠加来重建。因此:
- 频域中的关系:理想低通滤波器和高通滤波器的频域响应互补,总和等于1。
- 图像重建:通过频域的低频成分和高频成分加和,可以还原图像。
这种滤波器的组合应用使得我们可以选择性地增强或抑制图像的不同特征,比如使用高通滤波器进行锐化、低通滤波器去除噪声等。
总结
本文讨论了数字图像处理中的傅里叶变换及其应用。傅里叶变换将图像从时域转换到频域,使滤波、降噪和压缩等操作更加高效。采样定理确保了变换后的频率信息完整,傅里叶变换简化了卷积操作,有助于设计低通、高通滤波器,以增强或抑制图像特征。在频域中,低频成分表示平滑区域,位于频谱中心,高频成分代表图像细节,位于频谱边缘。傅里叶变换的性质如共轭对称性、周期性等,使得频域分析更便捷,并在图像特征提取中具有广泛应用。