为什么要在频率域研究图像增强?

利用频率成分和图像外表之间的对应关系。滤波在频率域更为直观,它可以解释空间域滤波的某些性质。可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器的指导。一旦通过频率域试验选择了空间滤波,通常实施都在空间域进行。

傅里叶变换是为后面低通滤波或者说是高通滤波做准备,处理的是灰度图像。

一、傅里叶变换

傅里叶变换(Fourier Transform,FT)后,对同一事物的观看角度随之改变,可以从频域里发现一些从时域里不易察觉的特征。

原理:将满足一定条件的某个函数表示成三角函数(正弦/余弦函数)或者是二者的积分的线性组合,在不同的研究领域,傅里叶变换有不同的变体形式,连续傅里叶变换或者离散傅里叶变换。傅里叶变换是一种分析信号的方法,傅里叶变换用正弦波作为信号的成分。

傅里叶变换的实质是将一个信号分离为无穷多多正弦/复指数信号的加成,也就是说,把信号变成正弦信号相加的形式——既然是无穷多个信号相加,那对于非周期信号来说,每个信号的加权应该都是零——但有密度上的差别,你可以对比概率论中的概率密度来思考一下——落到每一个点的概率都是无限小,但这些无限小是有差别的所以,傅里叶变换之后,横坐标即为分离出的正弦信号的频率,纵坐标对应的是加权密度。

傅里叶变换的作用:

傅里叶变换可以将一个时域信号转换成在不同频率下对应的振幅及相位,其频谱就是时域信号在频域下的表现,而反傅里叶变换可以将频谱再转换回时域的信号。

图像进行傅里叶变换原理:

灰度图像是由二维的离散的点构成的。二维离散傅里叶变换常用于图像处理中,对图像进行傅里叶变换后得到其频谱图。频谱图中频率高低表征图像中灰度变化的剧烈程度。图像中边缘和噪声往往是高频信号,而图像背景往往是低频信号。我们在频率域内可以很方便地对图像的高频或低频信息进行操作,完成图像去噪,图像增强,图像边缘提取等操作。

图像高H,宽W。F(u,v)表示频域图像,f(x,y)表示时域图像。u的范围为[0,H−1],v的范围为[0,W−1]

使用OpenCV库函数实现傅里叶变换:

cv2.dft()是实数部分,cv2.magnitude()是虚数部分。

函数原型:img=cv2.dft(src, flags=None, nonzeroRows=None)

#src:输入图像,需要通过np.float32转换格式
        #flags:转换标记,其中DFT _INVERSE执行反向一维或二维转换,而不是默认的正向转换 .          #DFT _SCALE表示缩放结果,由阵列元素的数量除以它;DFT _ROWS执行正向或反向变换输入矩阵的每个单独的行,该标志可以同时转换多个矢量,并可用于减少开销以执行3D和更高维度的转换等;DFT _COMPLEX_OUTPUT执行1D或2D实数组的正向转换,这是最快的选择,默认功能;DFT _REAL_OUTPUT执行一维或二维复数阵列的逆变换,结果通常是相同大小的复数数组,但如果输入数组具有共轭复数对称性,则输出为真实数组
        #nonzeroRows:当参数不为零时,函数假定只有nonzeroRows输入数组的第一行(未设置)或者只有输出数组的第一个(设置)包含非零,因此函数可以处理其余的行更有效率,并节省一些时间;这种技术对计算阵列互相关或使用DFT卷积非常有用。

由于输出的频谱结果是一个复数,需要调用cv2.magnitude()函数将傅里叶变换的双通道结果转换为0到255的范围

cv2.magnitude()函数原型:cv2.magnitude(x, y)

#x表示浮点型X坐标值,即实部

#y表示浮点型Y坐标值,即虚部

结果的值为:

代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
img=cv2.imread("jiesi.jpg",0)
#OpneCV傅里叶变换函数
result =cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)#需要将图像进行一次float转换
#将频谱低频从左上角移动至中心位置
dft_shift = np.fft.fftshift(result)
#频谱图像双通道复数转换为0-255区间
result1 = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
#图像显示
plt.subplot(121), plt.imshow(img,'gray'), plt.title('原图像')
plt.axis('off')
plt.subplot(122), plt.imshow(result1,'gray'), plt.title('傅里叶变换')
plt.axis('off')
plt.show()

效果图如下:

使用Numpy库的图像傅里叶变换

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
img = cv.imread('jiesi.jpg',0)
#快速傅里叶变换算法得到频率分布
f = np.fft.fft2(img)
#默认结果中心点位置是在左上角,
#调用fftshift()函数转移到中间位置
fshift = np.fft.fftshift(f)
#fft结果是复数, 其绝对值结果是振幅
fimg = np.log(np.abs(fshift))
plt.subplot(121), plt.imshow(img,'gray'), plt.title('原图像')
plt.axis('off')
plt.subplot(122), plt.imshow(fimg,'gray'), plt.title('傅里叶变换')
plt.axis('off')
plt.show()

效果图如下:


傅里叶逆变换

OpenCV学习记录 三 (傅里叶逆变换原理及实现)相关推荐

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

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

  2. Opencv学习记录(三) —— 得到图像中目标物坐标的简单处理算法(望指正与补充)

    先描述一下使用场景: 我要识别一个红灯,已经把目标准确的提取出来了,二值图像中白色为目标物,现在要算出二值图中的白色像素点的坐标.因为之后需要移植到树莓派,所以需要高效的方法.             ...

  3. MySQL学习记录 (三) ----- SQL数据定义语句(DDL)

    相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...

  4. css学习记录三:文本属性

    css学习记录三:CSS文本属性 一.文本属性的作用 二.文本颜色 三.文本对齐 四.装饰文本 五.文本缩进 六.行间距 一.文本属性的作用 CSSS Text(文本)属性可定义文本的外观,比如文本的 ...

  5. Kafka学习记录(三)——Broker

    Kafka学习记录(三)--Broker 目录 Kafka学习记录(三)--Broker 对应课程 Zookeeper存储的Kafka信息 Broker总体工作流程 Broker的服役和退役 Kafk ...

  6. Opencv学习笔记(三) -- 图像压缩与保存

    1.图像压缩 1.1常用图像格式 bmp Windows位图格式.该格式为不压缩格式,缺点是图像文件较大. jpg JPEG是为静态图像所建立的第一个国际数字图像压缩标准,也是至今一直在使用的.应用最 ...

  7. webrtc学习记录三【创建基于RTCPeerConnection本机内的1v1音视频互通】

    系列文章目录 webrtc学习记录一[媒体录制MediaRecorder] webrtc学习记录二[基于socket.io创建信令服务器聊天室] 目录 系列文章目录 前言 一.媒体能力的协商过程 1. ...

  8. OpenCV学习记录(三):简单的使用图像掩膜提取图像中感兴趣对象

    OpenCV中给出了很多种提取对象特征的方法. 从简单的图像色块>图像阈值分割>轮廓查找>特征点检测>直方图检测等等有很多.这些简单的方法看似没有什么实际的场景可以直接拿来使用 ...

  9. 【算法+OpenCV】基于三次Bezier原理的曲线拟合算法C++与OpenCV实现

    近期,因为要实现经过多个控制点的曲线拟合,研究起了曲线拟合算法.综合搜索到的资料,发现Bezier曲线拟合算法是一种相对较容易实现.且拟合的效果较好的算法.关于Bezier曲线原理,请参照(Bezie ...

最新文章

  1. [转]机器学习和深度学习资料汇总【01】
  2. http工具类(支持https,连接池和失败重试)
  3. 牛客寒假5-D.炫酷路途
  4. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解(转载)
  5. Jsp之使用纯Java数据库驱动程序(sqlserver,Oracle数据库为例)
  6. HandleExternalEventActivity
  7. 公务员工资分配的一种方法
  8. 穿越东西冲、感受户外、爱上运动
  9. Interactive Sketch-Based Normal Map Generation with Deep Neural Networks
  10. yyds,Python爬虫从小白到Bigboss全套学习路线+视频+资料
  11. 短网址短链接哪个好用?2021年最好的缩短链接短网址推荐
  12. 双硫脲改性Zr-MOF吸附材料|聚多巴胺(PDA)改性MOF-5|羧酸改性的UiO-66(Zr)膜|有机骨架材料的定制技术
  13. 皮肤病,得了慢性荨麻疹怎么办?
  14. 【华为 OJ】密码验证合格程序
  15. 串口编程之三:VMware虚拟机下的串口调试
  16. CString时间字符串,COleDateTime,CTime类之间的转换
  17. CSV文本文件导入excel的四种方法
  18. FRM 数量分析笔记之概率分布
  19. 网包是如何到达另外一台电脑上的?当你在微信上发送一条消息时互联网发生了什么?
  20. 利用定向网络爬虫爬取豆瓣电影top250【Python】

热门文章

  1. Controllable Generation from Pre-trained Language Models via Inverse Prompting翻译
  2. 计算机专业的短期计划范文,制定计算机学习计划范文3篇
  3. php生成字母头像,Identicon:实现根据用户账号生成像素头像 php 版
  4. 基于微信奶共享会议室预约小程序系统设计与实现 开题报告
  5. Node 学习六、核心模块 events之 01 events 和 EventEmitter 类、发布订阅、EventEmitter 类源码解析和模拟实现
  6. 51单片机入门学习篇-led灯、按键、数码管、中断
  7. linux刻录光驱是哪个好,Linux中使用mkisofs或genisoimage刻录光盘
  8. itext Pdf页眉/页脚/水印
  9. 前端上传文件保存到变量中
  10. Android自定义ImageView圆角