设为首页 收藏本站
查看: 2083|回复: 0

[经验分享] python 简单图像处理(15) 图像的傅立叶变换

[复制链接]

尚未签到

发表于 2015-4-22 08:49:17 | 显示全部楼层 |阅读模式
  学过信号处理的都应该知道傅立叶变换
  把时域上的信号处理为频域上的信号叠加
  对于在空间域上的数字图像,我们也能通过傅立叶变换转换为频域类的信号
  在实现某些图像处理的时候,频域类的处理比空间域更简单
  好啦,我们来看看二维离散信号的傅立叶变换
DSC0000.png
  数字图像的二维离散傅立叶变换所得的结果的频域成分如图所示,左上角是直流成分,变换结果四个角周围对应于低频成分,中央部分对应于高频部分。
  为了便于观察,我们常常使直流成分出现在窗口的中央,可采取换位方法,变换后中心为低频,向外是高频
DSC0001.png
  我们来看看具体实例
  



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算法来做傅立叶变换
  我们来看看效果吧
DSC0002.jpg
  
  中间是没有换位前,后面是换位后
  在函数FFT中第二个参数是控制换位的
  默认是换位的
DSC0003.png
  按照此式计算,得到的傅立叶变换就是换位后的
  
  现在我们来看看得到的频域图到底有什么用吧
  在分析图像信号的频率特性时,对于一幅图像,直流分量表示预想的平均灰度,低频分量代表了大面积背景区域和缓慢变化部分,高频部分代表了它的边缘,细节,跳跃部分以及颗粒噪声
  
  在前面我们实现了图像在空域的模糊和锐化
  其实在频域,我们也能方便的实现图像的锐化和模糊
  我们截取频率的低频分量,对其作傅立叶反变换,得到的就是模糊后的图像
  我们截取频率的高频分量,对其作傅立叶反变换,得到的就是锐化后的图像
  
  我们来编写程序实现
  



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)
运行效果如下
DSC0004.jpg
  我们用一个矩形框,把频域最中心的低频部分过滤出来,反变换得到图像模糊后的样子
  把频域最中心的高频部分过滤出来,反变换得到图像锐化后的样子
  
  我们来看看一些规则图像的频域图像
DSC0005.png
DSC0006.png
  
  那个方形和菱形是随手画的,不是很标准,所以有很多干扰
  左边是原图
  中间的普通的频率变换
  右边的是对其进行对数扩展后的结果。在前面的灰度变换中,我们已经讲过了灰度变换
  
  
  好了,关于简单的图像的傅立叶变换,我们就做到这里

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59431-1-1.html 上篇帖子: 【循序渐进学Python】10.模块和包 下篇帖子: 删除目录下相同文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表