频域处理

25 年 6 月 2 日 星期一
1341 字
7 分钟

计算机视觉--频域处理

​ 近期被频域在图像上的相关操作折磨的不行,因此我被迫补了一下频域在图像处理的相关知识

前置

​ 本篇博客是为计算机视觉方向提供的频域操作,因此使用的是pytorch框架进行操作,并不是传统的cv或者numpy

知识

基本的复数知识 ,傅里叶变换基本知识,理解图像的数值化

技术

python(pytorch?)

基本概念

​ 传统图像处理大多集中在空域操作(图像的像素值),频域操作为图像的理解和处理提供了非常丰富和高效的工具,并在很多深度学习任务有种广泛重要的应用,现在我们先要了解,图像在频域和空域的相关概念

  • 空域:空间域是我们最直观的图像表示方式,对于我们常见的rgb图像来说,每个像素都有对应的rgb三个维度的明确数值,这才能构成我们彩色的图像,于此同时,single-channel也就是一维的灰度图,也就是把rgb图像根据线性关系转成单维度图像,也就是我们说的灰度图,常见的有,亮度图,深度图,透射率图等...
  • 频域:这里的频域特指的是图像的经过傅里叶变换由空域变成频域成分,频域成分包括了图像的周期性信息,帮助我们理解图像的全局和局部结构,这其中不可不提的就是高频和低频部分,高频成分更关注于图像的边缘,纹理,噪声等细节;低频成分代表图像的整体结构,细节比较少。根据这两者我们可以很明显的能领悟到对于去噪,图像恢复,重建等任务用频域处理的优越性!

具体操作

​ 下面我们就根据信息流的传递来阐述一下必备的频域变换以及常见的图像频域操作

傅里叶变换

​ 基本原理:任何的信号都可以表示为一组正弦波和余弦波的线性组合,对图像进行傅里叶变换,我们可以得到图像的频谱,或者叫频谱图。它是由一系列不同频域的复数组成,每个频域成分都包含了幅度和相位信息

​ 公式:

​ bug :傅里叶变换之后的结果通常以低频成分位于左上角,并且坐标是在左上角,沿右下方增加的

变换

​ 我们通常需要把频谱图的低频部分移到图像的中心,这样方便我们进行相关的操作

python
import torch
import matplotlib.pyplot as plt

x = torch.random(4,  3, 256, 256)#[B,C,H,W]
x = x.to(torch.float32)

x_fft = torch.fft.fft2(x,dim=(2,3),norm='ortho')#dim=(2,3)也就是在H,W上处理,对图像进行二维傅里叶变换,得到x_fft也就是特征图的频谱图

#计算幅度和相位
img_abs , img_pha = torch.abs(x_fft) , torch.angle(x_fft)

x_fft_shifted = torch.fft.fftshift(x_fft ,dim=(2,3))#非常关键的一步,把频谱图的低频部分转移到中心!!!

​ 对于图像的频域表示来说,低频通常出现在频谱的中心,高频通常出现在频谱的边缘,所以由于傅里叶变换之后低频在频谱边缘所以将其转移到中心是非常有必要的

掩码

​ 为了单独对低频或者高频某一成分进行处理,我们需要用mask来选定或者屏蔽特定的部分,来进行滤波等操作

python
h_crop ,w_crop= 10 , 10 #这里接着上面的代码,选取的是低频区域的大小,这一块是可以根据理论自定义的
H,W=x.shape[2],x.shape[3]

h_start =H//2 - h_crop//2
w_start =W//2 - w_crop//2#这是低频区域的起始点,这里就是把中间低频区域框出来了,因此上面把低频转移到中间的操作非常重要!!!

mask = torch.zeros_like(img_abs)
mask = [:,h_satrt:h_start + h_crop,w_start + w_crop, :] = 1 #[]里面的就是低频区域,这里全部都是手动实现的,把低频区域的mask设置为1,高频也就是0了

high_mask = 1 - mask
x_fft_high = x_fft * high mask
x_fft_low = x_fft * mask

​ 通过掩码的方式,我们分别得到了低频和高频的成分,值得注意的是,由于成分之间的边界过于模糊,所以这里的h_crop和w_crop的size需要仔细考虑

重建

​ 对于x_fft图像我们需要把低频从中间再移动会边缘,这样进行逆傅里叶变换后才可以得到正确的特征图(这里的正确可以理解为线性组合 重建x = 原特征图 x + 特定频域操作)

python
x_fft = torch.fft.ifftshift(x_fft_shifted) #低频移到中间

x_re = torch.fft.ifft2(x_fft,dim=(2,3),norm='ortho')

x_img = torch.abs(x_re) #取实部作为重建后的图像

进阶

​ 其实明显,对于进阶来说,我们只是对高频或者低频做特定的操作,来达到我们理论上的目的,在有了上面的代码基础之后,实现起来也不会是难事,我会随缘写几个比较好的进阶操作,大部分应该会是一些论文里看到的有趣的东西,慢慢更咯

文章标题:频域处理

文章作者:io-wy

文章链接:https://io-wy.github.io/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89--%E9%A2%91%E5%9F%9F%E5%A4%84%E7%90%86[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。