在做超分辨重建任务时,需要对重建图像做出评价,主要是人眼感官上的评价。这就需要我们从空域和频域两个方面对图像进行评价。下面给给出python实现的结果,并给出相应的代码。

图像(MxN)的二维离散傅立叶变换可以将图像由空间域变换到频域中去,空间域中用x,y来表示空间坐标,频域由u,v来表示频率,二维离散傅立叶变换的公式如下:

在python中,numpy库的fft模块有实现好了的二维离散傅立叶变换函数,函数是fft2,输入一张灰度图,输出经过二维离散傅立叶变换后的结果,但是具体实现并不是直接用上述公式,而是用快速傅立叶变换。结果需要通过使用abs求绝对值才可以进行可视化,但是视觉效果并不理想,因为傅立叶频谱范围很大,所以要用log对数变换来改善视觉效果。

在使用log函数的时候,要写成log(1 + x) 而不是直接用log(x),这是为了避开对0做对数处理。

另外,图像变换的原点需要移动到频域矩形的中心,所以要对fft2的结果使用fftshift函数。最后也可以使用log来改善可视化效果。

代码如下:

import numpy as np
import matplotlib.pyplot as pltimg = plt.imread('FFT/baboon.png')
plt.subplot(231),plt.imshow(img),plt.title('picture')#根据公式转成灰度图
img = 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]#显示灰度图
plt.subplot(232),plt.imshow(img,'gray'),plt.title('original')#进行傅立叶变换,并显示结果
fft2 = np.fft.fft2(img)
plt.subplot(233),plt.imshow(np.abs(fft2),'gray'),plt.title('fft2')#将图像变换的原点移动到频域矩形的中心,并显示效果
shift2center = np.fft.fftshift(fft2)
plt.subplot(234),plt.imshow(np.abs(shift2center),'gray'),plt.title('shift2center')#对傅立叶变换的结果进行对数变换,并显示效果
log_fft2 = np.log(1 + np.abs(fft2))
plt.subplot(235),plt.imshow(log_fft2,'gray'),plt.title('log_fft2')#对中心化后的结果进行对数变换,并显示结果
log_shift2center = np.log(1 + np.abs(shift2center))
plt.subplot(236),plt.imshow(log_shift2center,'gray'),plt.title('log_shift2center')
plt.show()

运行结果:

###根据公式实现的二维离散傅立叶变换如下:
import numpy as np
import matplotlib.pyplot as plt
PI = 3.141591265
img = plt.imread('temp.jpg')#根据公式转成灰度图
img = 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]#显示原图
plt.subplot(131),plt.imshow(img,'gray'),plt.title('original')#进行傅立叶变换,并显示结果
fft2 = np.fft.fft2(img)
log_fft2 = np.log(1 + np.abs(fft2))
plt.subplot(132),plt.imshow(log_fft2,'gray'),plt.title('log_fft2')h , w = img.shape
#生成一个同样大小的复数矩阵
F = np.zeros([h,w],'complex128')
for u in range(h):for v in range(w):res = 0for x in range(h):for y in range(w):res += img[x,y] * np.exp(-1.j * 2 * PI * (u * x / h + v * y / w))F[u,v] = res
log_F = np.log(1 + np.abs(F))
plt.subplot(133),plt.imshow(log_F,'gray'),plt.title('log_F')

直接根据公式实现复杂度很高,因为是四重循环,时间复杂度为O(M2N2),所以实际用的时候需要用快速傅立叶变换来实现。

python实现快速傅里叶变换:

import cvdef FFT(image,flag = 0):w = image.widthh = image.heightiTmp = 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 1else:num = 1iMat[i,j] = (iTmp[i,j]*num,0)cv.DFT(iMat,mFFT,cv.CV_DXT_FORWARD)return mFFTdef IFFT(mat):mIFFt = cv.CreateMat(mat.rows,mat.cols,cv.CV_32FC2)cv.DFT(mat,mIFFt,cv.CV_DXT_INVERSE)return mIFFtdef Restore(mat):w = mat.colsh = mat.rowssize = (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 1iRestore[i,j] = mat[i,j][0]*num/(w*h)return iRestoredef FImage(mat):w = mat.colsh = mat.rowssize = (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]/hiAdd[i,j] = mat[i,j][1]/h + mat[i,j][0]/hreturn iAdddef 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 mFilterimage = 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)

opencv实现傅里叶变换:

import numpy as np
import matplotlib.pyplot as plt
import cv2img = cv2.imread('HR/baboon.png',0)dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)magnitude_spectrum = 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

参考文献:

【1】文献一

【2】文献二

python实现图像傅里叶变换相关推荐

  1. python的图像傅里叶变换 np.fft.fft2 cv.dft 函数

    码字不易,如果对您有所帮助,记着点赞哦! 一. 图像傅里叶变换原理: 原理简介请参考:https://www.cnblogs.com/wojianxin/p/12529809.html 对二维图像进行 ...

  2. python傅里叶变换库_python的numpy库和cv2库实现图像傅里叶变换

    码字不易,如果对您有所帮助,记着点赞哦! 一. 图像傅里叶变换原理: 对二维图像进行傅里叶变换用如下公式进行: 图像长M,高N.F(u,v)表示频域图像,f(x,y)表示时域图像.u的范围为[0,M- ...

  3. 《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  4. 利用python对图像进行傅里叶变换_python用opencv 图像傅里叶变换

    傅里叶变换 dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT) 傅里叶逆变换 img_back = cv.idft(f_ishift ...

  5. [Python图像处理] 二十二.Python图像傅里叶变换原理及实现

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  6. [Python从零到壹] 六十四.图像识别及经典案例篇之图像傅里叶变换和傅里叶逆变换详解

    祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所 ...

  7. 利用python对图像进行傅里叶变换_python实现图像傅里叶变换

    创作不易,如果对您有所帮助,请帮忙点赞,感谢! 一. 傅里叶变换简介: 在数字图像处理中,有两个经典的变换被广泛使用--傅里叶变换和霍夫变换.傅里叶变换是将时间域上的信号转变为频率域上的信号,进而进行 ...

  8. 利用python对图像进行傅里叶变换_(九)OpenCV-Python学习—图像傅里叶变换

    对于二维图片,可以对其进行傅里叶变换,获取图片的频谱信息.频谱有很多应用,包括显著性检测,卷积定理,频率域滤波等,下面是图片傅里叶变换的一些基本概念: 1. 图像傅里叶变换 对于M行N列的图像矩阵f( ...

  9. 【OpenCV 例程200篇】76. OpenCV 实现图像傅里叶变换

    [OpenCV 例程200篇]76. OpenCV 实现图像傅里叶变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

最新文章

  1. 第十七章 大规模机器学习-机器学习老师板书-斯坦福吴恩达教授
  2. UNITY 打包安卓APK
  3. IDEA使用Maven打包时如何去掉测试阶段
  4. 详解三种主流分布式事务方案的优劣
  5. 百度Java三面:现场面试39题目实拍含答案!
  6. cordova 更改app版本_【ios马甲包cps联运】App上架难 马甲包不知道该怎么做?
  7. 小白也能看懂!教你如何快速搭建实用的爬虫管理平台
  8. 【siddhi】 siddhi kafka报错 SiddhiAppCreationException At stream SweetProductionStream source kafka
  9. CCF认证-2015-3-2 数字排序
  10. jquery 查找祖先元素_如何获得jQuery中元素的第一个祖先
  11. php数量百分比,mysql PHP行数+百分比
  12. 回顾Vue计算属性VS其他语法有感
  13. 8.UNIX 环境高级编程--进程控制
  14. mysql分组去掉重复记录_MYSQL中GROUP分组去除重复数据
  15. 有关mysql触发器的感悟_有关mysql触发器实例分享
  16. CAD中的曲线长度如何测量?
  17. 2020中科院信工所夏令营面试
  18. ceph 代码分析 读_Ceph代码分析-OSD篇
  19. mand-mobile框架:无法执行 ScrollView 下拉刷新/上拉加载
  20. python画多边形(八边形)

热门文章

  1. 基本的数据结构:单链表(Singly Linked List)
  2. 简单通讯录管理系统(Java)
  3. 树莓派3 搭建bt下载机---利用 aria2
  4. 什么是企业即时通讯(EIM)
  5. 记一次 Centos7 安装 GitLab CE v12.6.1
  6. 教你打造股市晴雨表——通过LSTM神经网络预测股市
  7. 雷神笔记本无法打开虚拟化(vt-x)
  8. 北京交通大学计算机学院考博要求,北京交通大学 博士研究生培养方案.doc
  9. 微信分享给好友实现跳转
  10. 2021年土建方向-岗位技能(质量员)多少分及格及土建方向-岗位技能(质量员)模拟考试题库