python实现图像的频域滤波_Python下opencv使用笔记(图像频域滤波与傅里叶变换)...

本文介绍了如何使用Python和OpenCV进行图像的频域滤波,包括傅里叶变换、频域滤波器(如高通、低通滤波器)的应用。通过实例展示了图像从时域到频域的转换,以及如何恢复图像。傅里叶变换在图像处理中起到了关键作用,能够提取图像的高频和低频信息,用于边缘检测和轮廓提取。
摘要由CSDN通过智能技术生成

本文转载自  https://blog.csdn.net/on2way/article/details/46981825

首先谢谢原创博主了,这篇文章对我帮助很大,记录下方便再次阅读。

前面曾经介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这种方法直接对图像空间操作,操作简单,所以也是空间域滤波。

频域滤波说到底最终可能是和空间域滤波实现相同的功能,比如实现图像的轮廓提取,在空间域滤波中我们使用一个拉普拉斯模板就可以提取,而在频域内,我们使用一个高通滤波模板(因为轮廓在频域内属于高频信号),可以实现轮廓的提取,后面也会把拉普拉斯模板频域化,会发现拉普拉斯其实在频域来讲就是一个高通滤波器。

既然是频域滤波就涉及到把图像首先变到频域内,那么把图像变到频域内的方法就是傅里叶变换。关于傅里叶变换,感觉真是个伟大的发明,尤其是其在信号领域的应用,对于傅里叶变换的理解,要是刚接触这个东西,想要理解还真是非常的困难,除非你的数学功底特别好。这里推荐一个非常好的通俗易懂的博客(待会再去o-_-):

傅里叶分析之掐死教程(完整版)(o(╯□╰)o,链接文章已经找不到了)

傅里叶的原理表明,任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。利用傅立叶变换算法直接测量原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位就可以表示原始信号。这里借用上述博客的一个图:

b5025fe1029dc54546c7f1821c72ca83.png

这个图就是把时域图像(大概是方波)变成了一系列的正弦波的线性叠加,其等价关系可以表示为:

那么可以看成是频率的变化(一般认为就是从1,2,…n定死了),所有的A就是对应频率下的振幅,所有的就是对应频率下的相位,那么对于任一个信号,如果都认为频率w是从1,2,3…一直增加的话,那么每个信号就只由一组振幅与一组来决定,他们的不同决定了最终信号的不同。

再来理解下什么是振幅,振幅就是各个频率下的信号的决定程度有多大,如果某个频率的振幅越大,那么它对原始信号的的重要性越大,像上图,当然是w=1的时候振幅最大,说明它对总的信号影响最多(去掉w=1的信号,原始信号讲严重变形)。越往后面,也就是越高频,振幅逐渐减小,那么他们的作用就越小,而他们对于整体信号又有什么影响呢?既然越小,那就是影响小,所以其实去掉,原始信号也基本上不变,他们影响就在于对原始信号的细节上的表现,比如原始信号上的边边角角,偶尔有个小凸起凹槽什么的,这些小细节部分都是靠这些个影响不大的高频信号来表现出来的。深入推广一下,这就很好理解为什么图像的高频信号其实表现出来的就是图像的边缘轮廓、噪声等等这些细节的东西了,而低频信号,表现的却是图像上整块整块灰度大概一样的区域了(这些个区域又称为直流分量区域)。

再来理解下什么是相位,相位表示其实表面对应频率下的正弦分量偏离原点的程度,再借用下上述博客中的一个图,把分量示意图放大了:

e302820dc3ed8d3672eaa41902918190.png 

上图看到,如果各个频率的分量相位都是0的话,那么每个正弦分量的最大值(在频率轴附近的那个最大值)都会落在频率轴为0上,然而上述图并不是这样。在说简单一点,比如原始信号上有个凹槽,正好是由某一频率的分量叠加出来的,那么如果这个频率的相位变大一点或者变小一点的话,带来的影响就会使得这个凹槽向左或者向右移动一下,也就是说,相位的作用就是精确定位到信号上一点的位置的。

好了,有了上述的概念,再来看看图像的傅里叶变换,上述举得例子是一维信号的傅里叶变换,并且信号是连续的,我们知道图像是二维离散的,连续与离散都可以用傅里叶进行变换,那么二维信号无非就是在x方向与y方向都进行一次一维的傅里叶变换得到,这么看来,可以想象,它的频率构成就是一个网格矩阵了,横轴从w=1到n,纵轴也是这样。所有图像的频率构成都认为是这样的,那么不同的就是一幅图的振幅与相位了(振幅与相位此时同样是一个网格矩阵),也就是说你在opencv或者matlab下对图像进行傅里叶变换后其实是可以得到图像的振幅图与相位图的,而想把图像从频域空间恢复到时域空间,必须要同时有图像的振幅图与相位图才可以,缺少一个就恢复的不完整(后面会实验看看)。

下面看看二维傅里叶变换,一个图像为M*N的图像f(x,y)进过离散傅里叶变换得到F(u,v),那么一般的公式为:

F(u,v)=∑x=0M−1∑y=0N−1f(x,y)e−j2π(ux/M+vy/N)

它的反变化就是:

92f20c730d85e838887f8863ee78a1a7.png

反变换就可以实现将频域图像恢复到时域图像。对正变换分析,当u=v=0时,那么:

aab35497c2136beac7e2369252bb616d.png

看看这个式子发现它是什么?f(x,y)可是时域里面图像的灰度。很明显,这个东西其实是整个图像的灰度求平均了(这里说的都是灰度图像),当图像进行傅里叶变换以后,你去把F(0,0)与原始图像平均灰度去比较看看是不是一样的。那么F(0,0)在频域内称为直流分量,其他的所有F称为交流分量,直流分量可以看到是在0处获得的,所以很明显是存在于低频分量下的。

说了这么多,来上个实验看看到底什么是傅里叶变换吧。在python+opencv下想实现图像傅里叶变换有两种途径,一种采用numpy包可以实现,还有opencv自带的可以实现,其中numpy带的使用方便,直观易懂。

1 import cv2

2 import numpy as np

3 import matplotlib.pyplot as plt

4

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值