简单图像处理——傅立叶变换

转载 2015年07月07日 09:02:18

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

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

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

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

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

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

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

我们来看看具体实例

复制代码
import cv

def FFT(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)
for i in range(h):
for j in range(w):
if flag == 0:
num
= -1 if (i+j)%2 == 1 else 1
else:
num
= 1
iMat[i,j]
= (iTmp[i,j]*num,0)
cv.DFT(iMat,mFFT,cv.CV_DXT_FORWARD)
return mFFT

def FImage(mat):
w
= mat.cols
h
= mat.rows
size
= (w,h)
iAdd
= cv.CreateImage(size,cv.IPL_DEPTH_8U,1)
for i in range(h):
for j in range(w):
iAdd[i,j]
= mat[i,j][1]/h + mat[i,j][0]/h
return iAdd

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中第二个参数是控制换位的

默认是换位的

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

 

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

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

 

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

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

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

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

 

我们来编写程序实现

复制代码
import cv

def FFT(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)
for i in range(h):
for j in range(w):
if flag == 0:
num
= -1 if (i+j)%2 == 1 else 1
else:
num
= 1
iMat[i,j]
= (iTmp[i,j]*num,0)
cv.DFT(iMat,mFFT,cv.CV_DXT_FORWARD)
return mFFT

def IFFT(mat):
mIFFt
= cv.CreateMat(mat.rows,mat.cols,cv.CV_32FC2)
cv.DFT(mat,mIFFt,cv.CV_DXT_INVERSE)
return mIFFt

def Restore(mat):
w
= mat.cols
h
= mat.rows
size
= (w,h)
iRestore
= cv.CreateImage(size,cv.IPL_DEPTH_8U,1)
for i in range(h):
for j in range(w):
num
= -1 if (i+j)%2 == 1 else 1
iRestore[i,j]
= mat[i,j][0]*num/(w*h)
return iRestore


def FImage(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)
for i in range(h):
for j in range(w):
# iReal[i,j] = mat[i,j][0]/h
# iIma[i,j] = mat[i,j][1]/h
iAdd[i,j] = mat[i,j][1]/h + mat[i,j][0]/h
return iAdd


def Filter(mat,flag = 0,num = 10):
mFilter
= cv.CreateMat(mat.rows,mat.cols,cv.CV_32FC2)
for i in range(mat.rows):
for j in range(mat.cols):
if flag == 0:
mFilter[i,j]
= (0,0)
else:
mFilter[i,j]
= mat[i,j]
for i in range(mat.rows/2-num,mat.rows/2+num):
for j in range(mat.cols/2-num,mat.cols/2+num):
if flag == 0:
mFilter[i,j]
= mat[i,j]
else:
mFilter[i,j]
= (0,0)
return mFilter

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)
复制代码
运行效果如下

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

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

 

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

 

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

左边是原图

中间的普通的频率变换

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


参考资料:

http://blog.sina.com.cn/s/blog_4bdb170b01019atv.html

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html

http://www.cnblogs.com/xianglan/archive/2010/12/30/1922386.html

 http://www.cnblogs.com/tornadomeet/archive/2012/07/26/2610414.html

http://blog.csdn.net/ubunfans/article/details/24787569

http://blog.csdn.net/lichengyu/article/details/18848281


解读图像傅里叶变换

傅里叶讲的是:任何信号(如图像信号)都可以表示成一系列正弦信号的叠加。傅里叶变换是数字图像处理技术的基础,其通过在时域和频域来回切换图像,对图像的信息特征进行提取和分析。在图像领域就是将图像亮度的变化...
  • maryhuan
  • maryhuan
  • 2014年03月21日 10:35
  • 1220

MATLAB 傅里叶变换 图像锐化 代码

  • 2014年04月24日 20:47
  • 178KB
  • 下载

图像处理中的傅里叶变换

傅立叶变换在图像处理中有非常重要的作用。因为不仅傅立叶分析涉及图像处理很多方面,傅立 叶改进算法,比如离散余弦变换,gabor与小波在图像处理中也有重要的分量。傅立叶变换在图像处理的重要作用:   ...
  • m0_37264397
  • m0_37264397
  • 2017年04月15日 19:34
  • 3575

图像处理----傅里叶变换

傅里叶变换 傅里叶谱
  • wxcdzhangping
  • wxcdzhangping
  • 2014年05月14日 10:13
  • 1998

傅里叶变换简单理解

【转载】http://blog.sina.com.cn/s/blog_6923201d010120zl.html 【转载】http://blog.csdn.net/goodshot/articl...
  • zhengtu009
  • zhengtu009
  • 2014年11月04日 10:44
  • 975

matlab 实现数字图像的傅立叶变换及滤波锐化

1. 启动MATLAB程序,读入一幅图像;对图像做FFT。使用’subplot’命令,同时显示原始图像其频谱图; IenaImg=imread('lena.jpg'); %读入原图像文件 fft...
  • hzh_csdn
  • hzh_csdn
  • 2016年11月21日 23:03
  • 1988

图像锐化和边缘检测

From: http://dsqiu.iteye.com/blog/1638589
  • djzhao
  • djzhao
  • 2016年06月14日 16:01
  • 377

图像处理之_傅立叶变换

将一幅图像从其空间域(spatialdomain)转换为频域(frequencydomain)。图像处理用到的主要是离散傅立叶变换(Discrete Fourier Transform),下文中简称D...
  • xieyan0811
  • xieyan0811
  • 2017年05月09日 13:03
  • 341

图像处理傅立叶变换

图像处理中傅里叶变换这一块一直比较难理解,这两天抽空一直在看,这里推荐几个网址: 1. CSDN上少有的杰出女程序员:《图像傅里叶变换》http://blog.csdn.net/abcjennif...
  • u011440696
  • u011440696
  • 2016年12月13日 14:12
  • 121

MFC数字图像处理(BMP格式读取 保存 DFT FFT 直方图 色调均化 缩放 模糊 锐化 滤镜 形态学处理 曲线 裁剪 灰度图 彩色图 自动阈值)

  • 2014年07月23日 10:40
  • 7.76MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单图像处理——傅立叶变换
举报原因:
原因补充:

(最多只允许输入30个字)