0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用傅里叶变换进行图像边缘检测

新机器视觉 来源:新机器视觉 2023-11-14 11:04 次阅读

今天我们介绍通过傅里叶变换求得图像的边缘

什么是傅立叶变换?

简单来说,傅里叶变换是将输入的信号分解成指定样式的构造块。例如,首先通过叠加具有不同频率的两个或更多个正弦函数而生成信号f(x),之后,仅查看f(x)的图像缺无法了解使用哪种或多少原始函数来生成f(x)。

这就是傅立叶变换最神奇的地方。将f(x)函数通过一个傅立叶变换器,我们就可以得到一个新的函数F(x)。F(x)的是最初生成f(x)函数的频率图。因此,通过查看F(x)我们就可以得到用于生成f(x)函数的原始频率。实际上,傅立叶变换可以揭示信号的重要特征,即其频率分量。

例如下图,该图中有f(x)函数合成时的两个不同频率的原函数和对应的傅里叶变换结果F(x)。

94bfa930-8228-11ee-939d-92fbcf53809c.png

生成该图片的代码如下:

Fs = 150.0; #采样率
Ts = 1.0 / Fs; #采样间隔
t = np.arange(0,1,Ts)#时间向量
ff1 = 5; #信号频率1 
ff2 = 10; #信号2的频率
y = np.sin(2 * np.pi * ff1 * t)+ np.sin(3 * np.pi * ff2 * t)

从图中可以看出,由于原始函数是由两个不同频率的输入函数组成的,因此经过傅立叶变换后的相应频率图显示了两个不同频率的尖峰。

这是对傅立叶变换的比较简单的解释。它是一个非常复杂但非常有用的功能,在数学,物理和计算机视觉中得到了广泛的应用。

图像处理中的傅立叶变换

现在我们知道了傅里叶变换对信号处理的作用。它将输入信号从时域转换到频域。

但是它在图像处理中有什么用?它将输入图像从空间域转换为频域。换句话说,如果要在进行傅立叶变换后绘制图像,我们将看到的只是高频和低频的频谱图。高频偏向图像中心,而低频偏向周围。具体形式如下图所示。

上面对图像进行傅里叶变换的结果可以通过如下代码实现:

import numpy as np 
import cv2 from matplotlib 
import pyplot as plt 
img = cv2.imread('scenery.jpg', 0) 
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft) magnitude_spectrum = 20 *    np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])) 
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray') 
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('After FFT'), plt.xticks([]), plt.yticks([])

现在我们可以对图像进行FFT(快速傅里叶变换)变换了,并且可以使用转换后的结果进行多种操作:

边缘检测—使用高通滤波器或带通滤波器

降噪—使用低通滤波器

图像模糊-使用低通滤镜

特征提取(在某些情况下)-过滤器和其他一些openCV工具的混合搭配

HPF滤波器

如前所述,在经过FFT变换的图像中,在中心处发现低频,而在周围散布了高频,我们可以创建一个掩码数组,该掩码数组的中心是一个圆,其余全部为零。当将此掩码数组作用于原始图像时,所得图像将仅具有低频。由于高频对应于空间域中的边缘,这样就可以实现图像中的边缘检测。这个掩码数组就时HPF滤波器。

我们可以通过如下代码生成HPF滤波器

mask = np.ones((rows, cols, 2), np.uint8) 
r = 80 center = [crow, ccol] 
x, y = np.ogrid[:rows, :cols] 
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r

尽管可以选择使用多种类型的过滤器,但是主要使用三种类型的过滤器:

高通滤波器(HPF)

低通滤波器(LPF)

带通滤波器(BPF)

使用openCV和NumPy的高通滤波器进行边缘检测

在计算机视觉领域中,检测图像边缘非常有用。一旦我们可以提取图像中的边缘,就可以将该知识用于特征提取或模式检测。

图像中的边缘通常由高频组成。因此,在对图像进行FFT(快速傅立叶变换)后,我们需要对FFT变换后的图像应用高通滤波器。该滤波器会阻止所有低频,仅允许高频通过。最后,我们对经过了滤波器的图像进行逆FFT,就会得到原始图像中一些明显的边缘特征。

接下来,我们使用汽车的图像进行此实验,这个过程的代码如下所示:

rows, cols = img.shape 
crow, ccol = int(rows / 2), int(cols / 2) # center 
# Circular HPF mask, center circle is 0, remaining all ones 
mask = np.ones((rows, cols, 2), np.uint8) 
r = 80 center = [crow, ccol] 
x, y = np.ogrid[:rows, :cols] 
mask_area = (x - center[0]) ** 2 + (y - center[1]) ** 2 <= r*r 
# apply mask and inverse DFT 
fshift = dft_shift * mask 
fshift_mask_mag = 2000 * np.log(cv2.magnitude(fshift[:, :, 0], fshift[:, :, 1])) 
f_ishift = np.fft.ifftshift(fshift) 
img_back = cv2.idft(f_ishift) 
img_back = cv2.magnitude(img_back[:, :, 0], img_back[:, :, 1])
plt.subplot(2, 2, 1), plt.imshow(img, cmap='gray') 
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 2), plt.imshow(magnitude_spectrum, cmap='gray') plt.title('After FFT'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 3), plt.imshow(fshift_mask_mag, cmap='gray') plt.title('FFT + Mask'), plt.xticks([]), plt.yticks([])
plt.subplot(2, 2, 4), plt.imshow(img_back, cmap='gray') plt.title('After FFT Inverse'), plt.xticks([]), plt.yticks([])
plt.show()

程序运行结果如下图所示:

可以看出,高通滤波器阻止了所有的低频信号,并且仅允许高频通过。由于边缘通常是由高频信号构成的,因此可以在最后的图像中找到原图像的边缘信息

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 滤波器
    +关注

    关注

    158

    文章

    7331

    浏览量

    174779
  • 变换器
    +关注

    关注

    17

    文章

    2027

    浏览量

    108380
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40774
  • 傅里叶变换
    +关注

    关注

    5

    文章

    415

    浏览量

    42242
  • 图像边缘检测

    关注

    0

    文章

    6

    浏览量

    6527

原文标题:使用傅里叶变换进行图像边缘检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    图像频率域分析之傅里叶变换

    文章目录傅里叶变换基础傅里叶级数傅里叶积分傅里叶变换一维连续傅里叶变换一维离散傅里叶变换二维离散傅里叶变换
    发表于 05-22 07:41

    Labview图像处理——边缘检测

    。Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像边缘不止一个像素;当对精度要求不是
    发表于 12-01 12:16

    傅里叶变换是什么?如何求傅里叶变换

    傅里叶变换是什么?三傅里叶变换的意义是什么?如何求傅里叶变换
    发表于 05-08 09:23

    DSP变换运算-傅里叶变换

    第24章 DSP变换运算-傅里叶变换本章节开始进入此教程最重要的知识点之一傅里叶变换。关于傅里叶变换,本章主要是把傅里叶相关的基础知识进行
    发表于 08-03 06:14

    基于小波变换的多源图像数据融合与边缘检测方法

    提出基于小波变换的多源图像数据融合和边缘检测的方法,对多源图像进行分解,将高频区域中的绝对值较大
    发表于 08-21 12:10 7次下载

    超空泡图像的自适应多尺度小波边缘检测

    文中采用自适应多尺度小波边缘检测,对超空泡图像进行边缘检测。算法中首先对
    发表于 11-03 15:47 29次下载

    小波变换图像边缘检测中的应用

    目前,被广泛使用的经典边缘检测算子有Sobel算子,Prewitt算子,Roberts算子,Log算子,Canny算子等等。这些算子的核心思想是图像边缘点是相对应于
    发表于 08-13 16:14 54次下载
    小波<b class='flag-5'>变换</b>在<b class='flag-5'>图像</b><b class='flag-5'>边缘</b><b class='flag-5'>检测</b>中的应用

    检测技术】快速傅里叶变换

    检测技术】 快速傅里叶变换,测控技术仪器必备课程,喜欢学习的朋友可以下载学习学习。
    发表于 11-18 16:53 0次下载

    小波变换傅里叶变换好在哪里_小波变换傅里叶变换详解

    小波变换傅里叶变换有什么区别吗?小波变换傅里叶变换哪个好?我们通过小波变换傅里叶变换的详细
    发表于 01-13 11:02 1.5w次阅读
    小波<b class='flag-5'>变换</b>比<b class='flag-5'>傅里叶变换</b>好在哪里_小波<b class='flag-5'>变换</b>与<b class='flag-5'>傅里叶变换</b>详解

    如何进行图像边缘检测

      本期我们一起看看如何进行图像边缘检测边缘检测通常用于理解
    的头像 发表于 06-20 15:14 731次阅读
    如何<b class='flag-5'>进行</b><b class='flag-5'>图像</b><b class='flag-5'>边缘</b>的<b class='flag-5'>检测</b>

    傅里叶变换基本性质 傅里叶变换本质 傅里叶变换的应用

    傅里叶变换基本性质 傅里叶变换本质 傅里叶变换的应用 傅里叶变换是现代数学、物理学、工程学等领域中非常重要的一种数学工具和基本理论。在信号处理、图像
    的头像 发表于 09-07 16:18 5929次阅读

    图像进行傅里叶变换的意义

    图像进行傅里叶变换的意义 傅里叶变换是一种将一个信号分解成其频率分量的方法,它在信号处理、图像处理、电信领域、计算机视觉领域等方面都有着广
    的头像 发表于 09-07 16:18 1800次阅读

    傅里叶变换和傅里叶逆变换的关系

    傅里叶变换和傅里叶逆变换的关系  傅里叶变换和傅里叶逆变换是信号处理领域中极具重要性的数学工具,它们被广泛应用于很多领域,例如音频、图像处理
    的头像 发表于 09-07 16:43 4027次阅读

    傅里叶变换和离散傅里叶变换的关系

    傅里叶变换和离散傅里叶变换的关系 傅里叶变换(Fourier Transform)是一种将时间域(或空间域)的信号转换为频率域(或波数域)的信号的数学工具。而离散傅里叶变换(Discr
    的头像 发表于 09-07 17:04 1667次阅读

    傅里叶变换的定义 傅里叶变换的意义

    傅里叶变换的定义 傅里叶变换的意义  傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。 在不同的研究领域,傅里叶变换具有多种不同
    的头像 发表于 11-30 15:32 1003次阅读