二维DFT图像频域分析:从基础原理到实战应用
前言一维DFT我们已经玩明白了知道它能把复杂信号拆成一堆正弦波。那二维DFT呢简单说就是把这个“拆解魔法”搬到了图像上。一张图片其实也可以看作是二维信号二维DFT就能把它拆解成无数个不同方向、不同频率的二维正弦波。这篇就带大家从原理、公式、代码、实验一次性把二维DFT吃透看完你就能看懂图像的频域谱还能自己动手做滤波、去噪、锐化。一、二维DFT是什么1.1 核心思想一维DFT是把一维信号时间序列拆成不同频率的正弦波二维DFT是把二维信号图像拆成不同频率、不同方向的二维正弦波。通俗解释就像把一张复杂的“油画”拆成无数个不同粗细、不同方向的“条纹”这些条纹的频率、强度就是图像的频域信息。1.2 数学公式二维DFT的公式F ( u , v ) ∑ x 0 M − 1 ∑ y 0 N − 1 f ( x , y ) ⋅ e − j 2 π ( u x M v y N ) F(u, v) \sum_{x0}^{M-1} \sum_{y0}^{N-1} f(x, y) \cdot e^{-j2\pi\left(\frac{ux}{M} \frac{vy}{N}\right)}F(u,v)x0∑M−1y0∑N−1f(x,y)⋅e−j2π(MuxNvy)每个字母的含义f ( x , y ) f(x,y)f(x,y)原始图像x xx是行号y yy是列号( x , y ) (x,y)(x,y)是像素坐标M MM图像的高度行数N NN图像的宽度列数F ( u , v ) F(u,v)F(u,v)频域谱u uu是水平频率v vv是垂直频率e − j 2 π ( u x M v y N ) e^{-j2\pi(\frac{ux}{M}\frac{vy}{N})}e−j2π(MuxNvy)复指数函数负责把图像从时域空间域转换到频域j jj虚数单位j 2 − 1 j^2-1j2−1逆二维DFT公式把频域转回去f ( x , y ) 1 M N ∑ u 0 M − 1 ∑ v 0 N − 1 F ( u , v ) ⋅ e j 2 π ( u x M v y N ) f(x, y) \frac{1}{MN} \sum_{u0}^{M-1} \sum_{v0}^{N-1} F(u, v) \cdot e^{j2\pi\left(\frac{ux}{M} \frac{vy}{N}\right)}f(x,y)MN1u0∑M−1v0∑N−1F(u,v)⋅ej2π(MuxNvy)二、二维DFT的频域谱怎么看2.1 频域谱的分布规律直接做二维DFT得到的频域谱低频部分在四个角落高频在中间看起来很别扭。所以通常会用fftshift把频谱中心化让低频在中心高频在四周。图 1 二维 DFT 频域谱中心化示意图中心化后中心低频成分对应图像的整体亮度、大的轮廓四周高频成分对应图像的边缘、纹理、噪声对角线斜向的纹理信息通俗解释频域谱的亮度越高说明这个频率/方向的成分越强。比如一张有很多水平线条的图频域谱上垂直方向的点会很亮。2.2 常见图像的频域谱示例表1 不同图像的频域谱特征图像类型频域谱特征通俗解释纯色图像只有中心一个亮点没有任何纹理只有低频亮度水平条纹垂直方向有一排亮点水平纹理对应垂直方向的频率斜向条纹对角线方向有亮点斜向纹理对应对角线方向的频率带噪声图像频域谱四周均匀发亮噪声都是高频分布在所有方向三、核心代码二维DFT实战下面是Python实现二维DFT的完整代码包含频域谱生成、中心化、低通/高通滤波。importcv2importnumpyasnpimportmatplotlib.pyplotasplt# 解决中文显示 plt.rcParams[font.family][SimHei,WenQuanYi Micro Hei,Heiti TC]plt.rcParams[axes.unicode_minus]False# 负号正常显示# # 1. 读取彩色图像 预处理defload_image(path):imgcv2.imread(path)# 读取彩色图returnimg# shape (H, W, 3)# 2. 对 单通道 做二维DFT 中心化defdft_channel(channel):img_floatnp.float32(channel)dftcv2.dft(img_float,flagscv2.DFT_COMPLEX_OUTPUT)dft_shiftnp.fft.fftshift(dft)magnitude20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])1e-8)returndft_shift,magnitude# 3. 彩色图像 DFT三通道分别处理defdft_image(img):b,g,rcv2.split(img)dft_b,mag_bdft_channel(b)dft_g,mag_gdft_channel(g)dft_r,mag_rdft_channel(r)return(dft_b,dft_g,dft_r),(mag_b,mag_g,mag_r)# 4. 单通道低通滤波deflow_pass_channel(dft_shift,radius30):rows,colsdft_shift.shape[:2]crow,ccolrows//2,cols//2masknp.zeros((rows,cols,2),np.float32)cv2.circle(mask,(ccol,crow),radius,(1,1),-1)filtered_dftdft_shift*mask filtered_dft_shiftnp.fft.ifftshift(filtered_dft)img_backcv2.idft(filtered_dft_shift)img_backcv2.magnitude(img_back[:,:,0],img_back[:,:,1])cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(img_back)# 5. 彩色低通滤波deflow_pass_filter(dft_tuple,radius30):dft_b,dft_g,dft_rdft_tuple blow_pass_channel(dft_b,radius)glow_pass_channel(dft_g,radius)rlow_pass_channel(dft_r,radius)returncv2.merge((b,g,r))# 6. 单通道高通滤波defhigh_pass_channel(dft_shift,radius30):rows,colsdft_shift.shape[:2]crow,ccolrows//2,cols//2masknp.ones((rows,cols,2),np.float32)cv2.circle(mask,(ccol,crow),radius,(0,0),-1)filtered_dftdft_shift*mask filtered_dft_shiftnp.fft.ifftshift(filtered_dft)img_backcv2.idft(filtered_dft_shift)img_backcv2.magnitude(img_back[:,:,0],img_back[:,:,1])cv2.normalize(img_back,img_back,0,255,cv2.NORM_MINMAX)returnnp.uint8(img_back)# 7. 彩色高通滤波defhigh_pass_filter(dft_tuple,radius30):dft_b,dft_g,dft_rdft_tuple bhigh_pass_channel(dft_b,radius)ghigh_pass_channel(dft_g,radius)rhigh_pass_channel(dft_r,radius)returncv2.merge((b,g,r))# 主函数defmain():img_pathD:/datasets/test/cat.png# 你的彩色图路径imgload_image(img_path)dft_tuple,mag_tupledft_image(img)low_pass_imglow_pass_filter(dft_tuple,radius50)high_pass_imghigh_pass_filter(dft_tuple,radius50)# 合并频域幅度谱取平均显示mag_show(mag_tuple[0]mag_tuple[1]mag_tuple[2])/3# 画图中文正常显示plt.figure(figsize(12,8))plt.subplot(221),plt.imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)),plt.title(原图)plt.subplot(222),plt.imshow(mag_show,cmapgray),plt.title(中心化频域谱)plt.subplot(223),plt.imshow(cv2.cvtColor(low_pass_img,cv2.COLOR_BGR2RGB)),plt.title(低通滤波去噪/模糊)plt.subplot(224),plt.imshow(cv2.cvtColor(high_pass_img,cv2.COLOR_BGR2RGB)),plt.title(高通滤波边缘提取)plt.show()if__name____main__:main()四、实验分析滤波效果对比4.1 低通滤波效果图2 低通滤波前后对比原图清晰但有噪声/细节低通滤波后图像变模糊噪声消失保留了整体轮廓原理去掉了频域四周的高频噪声只保留中心低频通俗解释低通滤波就是“去噪模糊”适合去除图像中的颗粒噪声。4.2 高通滤波效果图3 高通滤波前后对比原图包含丰富纹理和边缘高通滤波后只保留了边缘和纹理整体亮度消失原理去掉了频域中心的低频亮度只保留四周高频通俗解释高通滤波就是“边缘提取锐化”适合检测图像的轮廓和细节。表2 不同半径的低通滤波效果对比滤波半径效果适用场景20轻微模糊保留细节轻度去噪50中等模糊噪声去除明显常规去噪100严重模糊只剩大轮廓图像简化五、常见问题与注意事项5.1 为什么频域谱要中心化原始DFT的低频在四个角落不便于观察和滤波。中心化后低频在中心高频在四周滤波时直接在中心画圆即可操作更直观。5.2 为什么要对频域谱取对数频域谱的动态范围很大直接显示会导致中心过亮、四周过暗看不清细节。取对数可以压缩动态范围让高低频的差异更明显。5.3 滤波时掩码的半径怎么选半径越小保留的低频越少低通滤波效果越强图像越模糊半径越大保留的高频越少高通滤波效果越强边缘越明显。一般可以通过调试找到适合的半径。六、二维DFT的应用场景图像去噪用低通滤波去除高频噪声边缘检测用高通滤波提取图像边缘图像压缩保留低频信息丢弃高频冗余信息图像增强通过频域处理提升图像对比度纹理分析通过频域谱判断图像的纹理方向和频率七、总结二维DFT把图像从空间域转换到频域让我们能更直观地分析和处理图像的频率成分。低通滤波去噪、高通滤波提取边缘都是二维DFT最经典的应用。这篇博客从原理、公式、代码到实验完整覆盖了二维DFT的核心内容大家可以用上面的代码跑一遍亲自感受一下频域处理的神奇效果。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2548705.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!