| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> opencv-python学习笔记(十二)—— 图像处理之傅里叶变换 -> 正文阅读 |
|
[人工智能]opencv-python学习笔记(十二)—— 图像处理之傅里叶变换 |
系列文章目录FFT利用OpenCV对图像进行傅里叶变换、使用Numpy中可用的FFT函数、傅里叶变换的一些应用 1. 理论采用傅里叶变换分析各种滤波器的频率特性。对于图像,采用二维离散傅里叶变换(DFT)来求频域。DFT的计算采用了快速傅里叶变换(FFT)算法。关于这些的细节可以在任何图像处理或信号处理的教科书中找到。请参阅附加参考资料部分。 正弦信号 x ( t ) = A sin ? ( 2 π f t ) x(t)=A \sin (2 \pi f t) x(t)=Asin(2πft),我们可以说f是信号的频率,如果观察其频域,我们可以看到一个峰值在f。如果信号采样形成离散信号,我们得到相同的频域,但周期为(?π,π]或[0,2π)(在N-point DFT中为(0,N))。你可以把一幅图像看作是一个在两个方向上采样的信号。在X和Y方向上进行傅里叶变换得到图像的频率表示。 更直观地说,对于正弦信号,如果振幅在短时间内变化如此之快,你可以说它是一个高频信号。如果变化缓慢,则为低频信号。你可以把同样的想法延伸到图像上。振幅在图像中什么地方变化很大?在边缘点,或噪音。所以我们可以说,边缘和噪声是图像中的高频内容。如果振幅变化不大,则为低频分量。(一些链接被添加到附加资源_,它直观地解释了频率转换的例子)。 现在我们来看看如何求傅里叶变换。 2. 傅里叶变换(Numpy)首先,我们将看到如何使用Numpy进行傅里叶变换。Numpy有一个FFT包来做这个。Np.fft.fft2()为我们提供了一个复杂数组的频率变换。它的第一个参数是输入图像,即灰度。第二个参数是可选的,它决定输出数组的大小。如果大于输入图像的大小,则在FFT计算前用零填充输入图像。如果小于输入图像,输入图像将被裁剪。如果没有传入参数,输出数组的大小将与输入数组相同。 现在一旦你得到结果,零频率成分(直流成分)将在左上角。如果你想让它居中,你需要在两个方向上移动N/2。这只是由函数**np.fft.fftshift()**完成。(这样分析起来更直观)。一旦你找到了频率变换,你就能找到幅度谱。
所以你实现了频率变换,现在你可以在频域做一些操作,比如高通滤波和重建图像,或者相反。为此,你只需通过一个大小为60x60的矩形窗口来屏蔽低频。然后使用np.fft.ifftshift()进行逆变换,使直流成分再次出现在左上角。然后使用np.ifft2()函数找到逆FFT。结果还是一个复数。可以取它的绝对值。
如果仔细观察结果,特别是最后一张JET颜色的图像,你可以看到一些成分(我用红色箭头标记的一个实例)。它显示出一些波纹状的结构,这被称为振铃效应。这是由于我们用矩形窗口做mask造成的。这个mask被转换成sin形状,这导致了这个问题。所以矩形窗口不用于过滤。更好的选择是Gaussian窗口。 3. 傅里叶变换(Opencv)OpenCV为此提供了 cv.dft() 和 cv.idft() 函数。它返回与前面相同的结果,但是有两个通道。第一个通道是结果的实部,第二个通道是结果的虚部。输入图像应先转换为np.float32。我们将看到如何去做。
现在我们要做逆DFT。在之前的会话中,我们创建了一个HPF(高通滤波器),这一次我们将看到如何删除图像中的高频内容,即我们应用LPF(低通滤波器)。它实际上模糊了图像。为此,我们首先创建一个掩膜,其在低频部分为1,高频部分为0。
对于cv.magnitude,其作用是计算二维矢量的大小。即对于矢量
(
x
,
y
)
(x,y)
(x,y),计算其大小(模): 4. DFT的性能优化对于某些数组大小,DFT计算的性能更好。当数组大小是2的幂时,它是最快的。对于大小为2、3和5的乘积的数组,处理效率也相当高。因此,如果你担心代码的性能,可以在找到DFT之前将数组的大小修改为任何最佳大小(通过填充零)。对于OpenCV,你必须手动填充零。但是对于Numpy,你指定FFT计算的新大小,它会自动为你补零。 那么如何找到最优大小呢?OpenCV为此提供了一个函数cv.getOptimalDFTSize()。cvt .dft()和np.fft.fft2()都适用。让我们使用IPython magic命令timeit来检查它们的性能。
看,大小(342,548)被修改为(360,576)。现在让我们用零填充它(对于OpenCV),并找出它们的DFT计算性能。你可以通过创建一个新的大一点的全零数组并将数据复制到它来实现,或者使用cv.copyMakeBorder()。
或者
现在我们进行Numpy函数的DFT性能比较:
可以看出快了4倍。现在我们将对OpenCV函数进行同样的尝试。
可以看出快了4倍。你还可以看到OpenCV函数比Numpy函数快3倍左右。这也可以用来测试逆FFT,留给你们做练习。 5. 为什么 Laplacian是高通滤波器?类似的问题也在一个论坛上被问及。问题是,为什么Laplacian是高通滤波器?为什么sobel是高通滤波器?等。第一个问题的答案与傅里叶变换有关。对更大尺寸的傅里叶变换进行拉普拉斯变换。分析:
从图像中,你可以看到每个内核块的频率区域,以及它经过的区域。从这些信息中,我们可以知道为什么每个内核都是HPF或LPF 扩展资料
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/22 11:18:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |