在数字图像处理中,图像的直流分量(DC分量)是指图像中的平均亮度水平。这个概念源自于傅里叶变换,其中信号可以分解为多个频率成分。在这个上下文中,直流分量对应于频率为零的成分,即信号的平均值。
在JPEG图像压缩和其他类似的编码技术中,图像首先被分割成小块(例如8x8像素的块)。然后对每个块进行离散余弦变换(DCT)。DCT帮助将图像数据从空间域转换到频率域。在这个变换后的频率域表示中,直流分量位于左上角,代表了整个块的平均亮度。其余部分,称为交流分量(AC分量),代表了图像块中更高频率的细节信息,比如边缘和纹理。
由于直流分量代表的是整个块的平均亮度,它通常对整体图像质量的影响较大。在压缩过程中,直流分量通常会被优先保留,因为它包含了大量关于图像的重要信息。相比之下,一些较高频率的交流分量在压缩时可能会被减少或丢弃,这是因为人眼对这些细节的敏感度较低,减少它们对感知图像质量的影响较小。
图像的直流分量(DC分量)的数学原理可以通过离散余弦变换(DCT)来理解,特别是在图像压缩(如JPEG)中的应用。基本的数学概念和原理:
离散余弦变换(DCT)
定义:
DCT帮助将图像从空间域(像素强度)转换到频率域。这种转换对图像压缩非常有用,因为人眼对图像中的高频变化(如细小的边缘或纹理)不太敏感。
重要性
压缩:在图像压缩中,直流分量是非常重要的。由于它代表了图像块的平均亮度,它对于重建图像的整体外观至关重要。
编码效率:直流分量通常比其他高频分量具有更高的编码效率,因为它可以通过较少的比特表示。
应用
在JPEG等图像压缩算法中,首先将图像分割成小块(例如8x8像素),对每个块进行DCT,然后对这些变换后的块进行量化(减少精度以减小文件大小)。在这个过程中,直流分量通常被优先处理,因为它包含了关于图像块的关键信息。
编写代码,输出如下图所示的结果:
由函数np.fft.fft2可以得到其傅里叶变换系数,用np.abs计算复数幅度谱后可以得到频率为0时的直流分量。由函数np.average可以得到图像的灰度均值,根据第四章的作业题可以计算A=(F(0,0))/(MNf ?(x,y))来判断公式中归一化项的位置。如果F(0,0)= MNf ?(x,y),A=1,则1/MN项位于IDFT公式前;若F(0,0)=f ?(x,y),A=1/MN,则1/MN项位于DFT公式前;若F(0,0)= √MN f ?(x,y),A=1/√MN ,则1/√MN 项位于DFT和IDFT两个公式前。
将np.fft.fft2得到的傅里叶变换系数中频率为0的一项置为0,再经过np.fft.ifft2函数做傅里叶反变换得到直流分量置零后的图像(因为图像平均值被置零,因此输出图像应该比原图暗些)。注意,np.fft.ifft2函数的输出是复数,需用np.abs函数取其幅度得到输出图像。
代码实现
在这里插入代码片
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread("Fig0429.tif",0)
rows, cols = img.shape[0:2]
# 计算图像的均值
avg = np.average(img)
# 用Opencv的dft函数计算图像的频谱
dft = cv2.dft(np.float32(img))
# A=F(0,0)/MNfavg,若A=1,1/MN项位于IDFT公式前;
# 若A=1/MN,1/MN项位于DFT公式前;
# 若A=1/sqrt(MN),1/sqrt(MN)项位于DFT和IDFT公式前
A = dft[0, 0] / (rows*cols*avg)
print(A)
# 用numpy的fft2函数计算图像的频谱
dft = np.fft.fft2(img)
F = np.abs(dft)
A = F[0, 0] / (rows*cols*avg)
print(A)
# 将频谱的直流分量置0
dft[0, 0] = 0
# 傅里叶反变换得到直流分量置0后的图像
img_filtered = np.abs(np.fft.ifft2(dft))
img_list = [img, np.log(1+np.fft.fftshift(F)), np.log(1+np.fft.fftshift(np.abs(dft))), img_filtered]
img_name_list = ['original', 'DFT', 'filtered DFT', 'filtered image']
_, axs = plt.subplots(2, 2)
for i in range(2):
for j in range(2):
axs[i, j].imshow(img_list[i*2+j], cmap='gray')
axs[i, j].set_title(img_name_list[i*2+j])
axs[i, j].axis('off')
plt.savefig('image_filtered.jpg')
plt.show()
直流分量:将非正弦周期信号按傅里叶级数展开,频率为零的分量。
此题的流程如下:
由函数np.fft.fft2可以得到其傅里叶变换系数,用np.abs计算复数幅度谱后可以得到频率为0时的直流分量。由函数np.average可以得到图像的灰度均值,可以计算A=(F(0,0))/(MNf ?(x,y))来判断公式中归一化项的位置。如果F(0,0)= MNf ?(x,y),A=1,则1/MN项位于IDFT公式前;若F(0,0)=f ?(x,y),A=1/MN,则1/MN项位于DFT公式前;若F(0,0)= √MN f ?(x,y),A=1/√MN ,则1/√MN 项位于DFT和IDFT两个公式前。
将np.fft.fft2得到的傅里叶变换系数中频率为0的一项置为0,再经过np.fft.ifft2函数做傅里叶反变换得到直流分量置零后的图像,因为图像平均值被置零,因此输出图像应该比原图暗些。