利用python对图像进行傅里叶变换_python 简单图像处理(15) 图像的傅立叶变换...

学过信号处理的都应该知道傅立叶变换

把时域上的信号处理为频域上的信号叠加

对于在空间域上的数字图像,我们也能通过傅立叶变换转换为频域类的信号

在实现某些图像处理的时候,频域类的处理比空间域更简单

好啦,我们来看看二维离散信号的傅立叶变换

数字图像的二维离散傅立叶变换所得的结果的频域成分如图所示,左上角是直流成分,变换结果四个角周围对应于低频成分,中央部分对应于高频部分。

为了便于观察,我们常常使直流成分出现在窗口的中央,可采取换位方法,变换后中心为低频,向外是高频

我们来看看具体实例

importcvdefFFT(image,flag=0):

w=image.width

h=image.height

iTmp=cv.CreateImage((w,h),cv.IPL_DEPTH_32F,1)

cv.Convert(image,iTmp)

iMat=cv.CreateMat(h,w,cv.CV_32FC2)

mFFT=cv.CreateMat(h,w,cv.CV_32FC2)foriinrange(h):forjinrange(w):ifflag==0:

num=-1if(i+j)%2==1else1else:

num=1iMat[i,j]=(iTmp[i,j]*num,0)

cv.DFT(iMat,mFFT,cv.CV_DXT_FORWARD)returnmFFTdefFImage(mat):

w=mat.cols

h=mat.rows

size=(w,h)

iAdd=cv.CreateImage(size,cv.IPL_DEPTH_8U,1)foriinrange(h):forjinrange(w):

iAdd[i,j]=mat[i,j][1]/h+mat[i,j][0]/hreturniAdd

image=cv.LoadImage('lena.jpg',0)

mAfterFFT=FFT(image)

mBeginFFT=FFT(image,1)

iAfter=FImage(mAfterFFT)

iBegin=FImage(mBeginFFT)

cv.ShowImage('image',image)

cv.ShowImage('iAfter',iAfter)

cv.ShowImage('iBegin',iBegin)

cv.WaitKey(0)

这里我们直接用了OpenCV的DFT算法来做傅立叶变换

我们来看看效果吧

中间是没有换位前,后面是换位后

在函数FFT中第二个参数是控制换位的

默认是换位的

按照此式计算,得到的傅立叶变换就是换位后的

现在我们来看看得到的频域图到底有什么用吧

在分析图像信号的频率特性时,对于一幅图像,直流分量表示预想的平均灰度,低频分量代表了大面积背景区域和缓慢变化部分,高频部分代表了它的边缘,细节,跳跃部分以及颗粒噪声

在前面我们实现了图像在空域的模糊和锐化

其实在频域,我们也能方便的实现图像的锐化和模糊

我们截取频率的低频分量,对其作傅立叶反变换,得到的就是模糊后的图像

我们截取频率的高频分量,对其作傅立叶反变换,得到的就是锐化后的图像

我们来编写程序实现

importcvdefFFT(image,flag=0):

w=image.width

h=image.height

iTmp=cv.CreateImage((w,h),cv.IPL_DEPTH_32F,1)

cv.Convert(image,iTmp)

iMat=cv.CreateMat(h,w,cv.CV_32FC2)

mFFT=cv.CreateMat(h,w,cv.CV_32FC2)foriinrange(h):forjinrange(w):ifflag==0:

num=-1if(i+j)%2==1else1else:

num=1iMat[i,j]=(iTmp[i,j]*num,0)

cv.DFT(iMat,mFFT,cv.CV_DXT_FORWARD)returnmFFTdefIFFT(mat):

mIFFt=cv.CreateMat(mat.rows,mat.cols,cv.CV_32FC2)

cv.DFT(mat,mIFFt,cv.CV_DXT_INVERSE)returnmIFFtdefRestore(mat):

w=mat.cols

h=mat.rows

size=(w,h)

iRestore=cv.CreateImage(size,cv.IPL_DEPTH_8U,1)foriinrange(h):forjinrange(w):

num=-1if(i+j)%2==1else1iRestore[i,j]=mat[i,j][0]*num/(w*h)returniRestoredefFImage(mat):

w=mat.cols

h=mat.rows

size=(w,h)#iReal = cv.CreateImage(size,cv.IPL_DEPTH_8U,1)#iIma = cv.CreateImage(size,cv.IPL_DEPTH_8U,1)iAdd=cv.CreateImage(size,cv.IPL_DEPTH_8U,1)foriinrange(h):forjinrange(w):#iReal[i,j] = mat[i,j][0]/h#iIma[i,j] = mat[i,j][1]/hiAdd[i,j]=mat[i,j][1]/h+mat[i,j][0]/hreturniAdddefFilter(mat,flag=0,num=10):

mFilter=cv.CreateMat(mat.rows,mat.cols,cv.CV_32FC2)foriinrange(mat.rows):forjinrange(mat.cols):ifflag==0:

mFilter[i,j]=(0,0)else:

mFilter[i,j]=mat[i,j]foriinrange(mat.rows/2-num,mat.rows/2+num):forjinrange(mat.cols/2-num,mat.cols/2+num):ifflag==0:

mFilter[i,j]=mat[i,j]else:

mFilter[i,j]=(0,0)returnmFilter

image=cv.LoadImage('lena.jpg',0)

mFFT=FFT(image)

mIFFt=IFFT(mFFT)

iAfter=FImage(mFFT)

mLP=Filter(mFFT)

mIFFt1=IFFT(mLP)

iLP=FImage(mLP)

iRestore=Restore(mIFFt1)

mHP=Filter(mFFT,1)

mIFFt2=IFFT(mHP)

iHP=FImage(mHP)

iRestore2=Restore(mIFFt2)

cv.ShowImage('image',image)

cv.ShowImage('iAfter',iAfter)

cv.ShowImage('iLP',iLP)

cv.ShowImage('iHP',iHP)

cv.ShowImage('iRestore',iRestore)

cv.ShowImage('iRestore2',iRestore2)

cv.WaitKey(0)

运行效果如下

我们用一个矩形框,把频域最中心的低频部分过滤出来,反变换得到图像模糊后的样子

把频域最中心的高频部分过滤出来,反变换得到图像锐化后的样子

我们来看看一些规则图像的频域图像

那个方形和菱形是随手画的,不是很标准,所以有很多干扰

左边是原图

中间的普通的频率变换

右边的是对其进行对数扩展后的结果。在前面的灰度变换中,我们已经讲过了灰度变换

好了,关于简单的图像的傅立叶变换,我们就做到这里

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 傅立叶变换是一种将时域信号转换为频域信号的数学方法。在图像处理中,傅立叶变换可以将图像转换为频域表示,从而方便进行滤波、压缩、特征提取等操作。Python中的numpy库提供了傅立叶变换的实现,可以通过numpy.fft模块中的fft2函数对图像进行二维傅立叶变换傅立叶变换的结果是一个复数数组,其中每个元素表示对应频率的幅度和相位信息。可以通过numpy.fft模块中的ifft2函数将频域信号转换回时域信号。 ### 回答2: 傅里变换是一种数学技术,可以将一个信号分解为一系列简单的正弦和余弦波。在图像处理中,傅里变换可以将图像从空间域(像素表示)转换为频率域(幅度和相位表示),这有助于我们更好地理解图像特征和纹理、去噪和压缩图像等任务。 Python中,我们可以使用SciPy库中的fftpack模块来执行傅里变换。该模块提供了许多函数,如fft2(二维离散傅里变换)和ifft2(逆变换),可以在频域和空间域之间进行转换。我们可以使用matplotlib和numpy库来可视化和处理变换后的图像。 一般来说,我们首先需要将图像的灰度值归一化为0到1之间的值,然后使用fft2函数对其执行傅里变换,得到频谱表示。这个频谱表示实际上是由正弦和余弦波的幅度和相位组成的。我们可以使用numpy库中的abs函数和angle函数来提取幅度和相位信息。然后可以使用这些信息来进行图像处理,例如滤波或重建。 在进行滤波时,我们需要在频率域中选择要过滤的频率范围并将其设置为零,或者对频率范围之外的值进行放大或缩小。然后,我们可以使用ifft2函数将滤波后的频谱转换回空间域,得到过滤后的图像。 在图像处理中,傅里变换可以帮助我们更好地理解图像的特征和纹理,去除图像中的噪声和压缩图像等任务。使用Python中的SciPy库和matplotlib和numpy库的组合,我们可以轻松地执行傅里变换和相应的图像处理任务。 ### 回答3: 傅立叶变换是一种将信号从时间域转换到频率域的算法,常用于图像处理领域。在图像处理中,图像可以看做是一个二维信号,因此需要使用二维傅立叶变换。 二维傅立叶变换图像从空间域转换到频率域,即将每个像素点的灰度值表示为从低频到高频的复杂振幅和相位的组合。低频表示图像中变化平缓的部分,高频表示图像中变化快速的部分。 在Python中,可以使用NumPy库中的fft2()函数来进行二维傅立叶变换。首先需要将图像转换为灰度图,并将其表示为一个矩阵。然后使用fft2()函数对矩阵进行傅立叶变换,得到一个与输入矩阵大小相同的复数数组。 为了可视化结果,可以使用fftshift()函数将频率最低点移到中心,并使用log()函数将结果取对数。最后使用imshow()函数将频谱图显示出来,可以清晰地看到图像中各个部分的频率分布情况。 在进行频域处理之后,可以使用ifft2()函数将得到的结果逆变换回空间域,得到处理后的图像。同时,也可以进行各种基于频域的图像处理操作,如滤波、去噪等。 总之,利用Python进行图像傅立叶变换可以提取图像的频域特征,为后续的图像处理和分析提供基础。同时,Python强大的科学计算库和便捷的语法结构也为图像处理带来了更加高效和方便的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值