频域边缘检测

时间:2017-12-23 09:35:54

标签: image-processing edge-detection dct

如何应用滤波器来检测频域中的边缘?我已将离散余弦变换应用于输入图像。

我不知道如何应用滤镜来检测边缘。任何人都可以帮助检测边缘吗?

1 个答案:

答案 0 :(得分:1)

有很多方法可供选择,其中一个特别提到的是用于检测光谱信号边缘的concentration factor method

但是,这些方法通常用于连续频率信号,并且 no 理由在图像上使用它。它比基于卷积核的方法慢,如用于Canny边缘检测的Sobel滤波器,并且文献对于仅给出基于频率的信息的领域更加专业,如在雷达或MRI信号的重建中。

图像包含本地信息,例如功能(例如边缘)所在的位置。频谱表示提供全局信息,例如图像中某些模式重复的频率。在某些领域中,从全局模式重建本地信息是必要的,但是当您已经拥有本地数据(即图像)时,根本不需要使用。换句话说,你基本上是通过首先转换图像来丢弃信息。

无论哪种方式,要在频域中应用滤波器,只需将傅里叶系数(变换后的图像的值)相乘即可。例如,假设您对矢量中的信号进行傅里叶变换,波数从0增加,即矢量[f0, f1, ..., fn-1],其中每个fii傅里叶系数。高通滤波器是一种允许高频通过并消除低频的滤波器。因此,如果您想象这个相同的向量但现在相乘以便抑制较低的频率,它可能看起来像[f0/10000, f1/1000, f2/100, f3/10, f4]。如果您只是使用这些傅立叶系数将数据逆变换回图像空间,则可以抑制图像中的较低频率。

同样的想法适用于任何低通,带通,高通等滤波器。您只需将傅立叶系数乘以某个比例,或者您可以使用傅里叶系数的某个窗口,忽略或缩放其余系数。您可以尝试使用线性缩放,对数缩放或只是一个架子,并查看图像中的差异。

例如在使用Python的OpenCV中,此代码很小并显示了这个想法。这是图像:

>>> import numpy as np
>>> import cv2
>>> img = np.zeros((8, 8), dtype=np.float32)
>>> img[2:6, 2:6] = 1
>>> img
array([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  1.,  1.,  1.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]], dtype=float32)

所以它只是一个黑色图像,中间是白色方块。如果你想检测边缘,那么基本的基本方法就是高通滤波器。因此,你可以采用傅立叶变换或DCT,然后去除低频(大多数库计算DCT的方式,中心值是低频,并且更靠近DCT图像边界的值更高频率---这也适用于OpenCV,因此我们只需将DCT中心的值设置为零)

>>> dct_coeff = cv2.dct(img)
>>> dct_coeff[2:6, 2:6] = 0

剩下要做的就是采用逆变换和阈值来查看边缘的位置:

>>> hp_img = cv2.idct(dct_coeff)
>>> hp_img > 0.75
array([[False, False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False, False],
       [False, False,  True,  True,  True,  True, False, False],
       [False, False,  True, False, False,  True, False, False],
       [False, False,  True, False, False,  True, False, False],
       [False, False,  True,  True,  True,  True, False, False],
       [False, False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False, False]], dtype=bool)

现在,这是一种非常基本的方法,噪声可以快速杀死高通滤波方法(因为噪声通常是高频)。当你需要转向高级方法时,例如集中系数。但即便如此,与Canny / Sobel边缘检测的强大功能和简单性相比,这种方法在图像上的使用并不是非常有用。