Image processing 频域边缘检测

Image processing 频域边缘检测,image-processing,edge-detection,dct,Image Processing,Edge Detection,Dct,如何应用滤波器在频域中检测边缘?我将离散余弦变换应用于输入图像 我不知道如何应用过滤器来检测边缘。有人能帮忙检测边缘吗?有很多方法可以做到这一点,我要特别提到的一种方法是检测光谱信号中的边缘 然而,这些方法通常用于连续频率信号,没有理由在图像上使用。它比基于卷积核的方法慢,比如用于Canny边缘检测的Sobel滤波器,并且文献更专门用于仅给出基于频率的信息的领域,比如从雷达或MRI信号重建 图像包含局部信息,例如特征(如边)的位置。光谱表示提供了全局信息,比如图像中某些图案的重复频率。在某些字段

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


我不知道如何应用过滤器来检测边缘。有人能帮忙检测边缘吗?

有很多方法可以做到这一点,我要特别提到的一种方法是检测光谱信号中的边缘

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

图像包含局部信息,例如特征(如边)的位置。光谱表示提供了全局信息,比如图像中某些图案的重复频率。在某些字段中,从全局模式重建局部信息是必要的,但当您已经拥有局部数据(即图像)时,根本不需要使用。换句话说,您基本上是通过先变换图像来抛出信息


无论哪种方式,要在频域中应用滤波器,只需乘以傅里叶系数(变换图像的值)。例如,假设对波数从0开始递增的向量中的信号进行傅里叶变换,即向量
[f0,f1,…,fn-1]
,其中每个
fi
都是
i
的傅里叶系数。高通滤波器是一种允许高频通过并去除低频的滤波器。因此,如果你想象这个相同的向量,但是现在它被乘以,所以低频被抑制,它可能看起来像
[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中心的值设置为零)

剩下要做的就是进行逆变换和阈值,以查看边的位置:

>>> 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边缘检测的功能和简单性相比,这种方法在图像上也不是非常有用。

在尝试时,你应该尝试一些东西,并询问你面临的问题。你能说一些应用过滤器的逻辑吗???@YahyaHussein:你是说“随机尝试一些东西”吗?非常感谢@Alexander Reynolds
>>> 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)