图像处理——我理解的傅里叶变换

2023-11-20

1.傅里叶变换的理解

傅里叶变换的相关数学公式目前还没有搞懂,先不整那个东西,我们主要是研究傅里叶变换的一些思想和应用。这个思想起源于牛顿研究那个三棱镜,白光透过棱镜之后会被分解为七种颜色的光,这些光叠加又能形成白光,所以说可以把一种事物分解成好几种事物的加和。

后来傅里叶就提出了 傅里叶级数 ,一个等幅度不同频或者等频不同幅的波形可以由一组正弦波余弦波的加和得到(原话:任何连续周期信号可以由一组适当的正弦曲线组合而成)

2.傅里叶级数

可以这么理解:原图像相当于在时间域中的一个曲线,坐标图是个二维坐标系,横轴是时间,纵轴是幅值的一个曲线,我们通过傅里叶变换可以把这条曲线变成多条正余弦函数相加的形式:傅里叶变换之后形成的是一个三维坐标系,他的x轴是频率(w),y轴是相位(因为每个正余弦函数的起点不同,有的是从零点开始,有的不是,这个曲线开始的那个幅值就是相位,相位就是后公式中的φ),z轴是振幅高度,。这样可以把一个图像从空间域转换到频率域,因为两者等价,所以可以逆变换回去。但这个傅里叶级数只能针对周期型函数才能拆分成多个正余弦函数相加,所以后来有了傅里叶变换。
f ( t ) = a n 2 + ∑ a n ∗ s i n ( n w t + φ n ) f(t) = \frac{a_n}{2}+\sum a_n*sin(nwt+φ_n) f(t)=2an+ansinnwt+φn

3.傅里叶变换

其中推导公式中用到了欧拉公式,
cos ⁡ ( x ) + i ∗ s i n ( x ) = e i x x = w t x = w t 表 示 在 单 位 圆 逆 时 针 旋 转 F T = ∫ − ∞ + ∞ f ( t ) e j w t d t \cos(x)+i*sin(x) = e^{ix}\\ x = wt\\ x = wt 表示在单位圆逆时针旋转\\ \\ F_T = \int_{-\infty}^{+\infty}f(t)e^{jwt}dt cos(x)+isin(x)=eixx=wtx=wtFT=+f(t)ejwtdt
然后通过逆变换可以再变回去。通过傅里叶变换就可以把一个随机的曲线,转换到频率域,只不过这次的三维坐标系对应的w和幅值的函数图像不再是离散的图像了,而是一个连续图像。y轴所对应的相位意义没变。

4.应用

- 声音

通过分析频率域,可以分析出低频可能是男生说话,高频可能是女生说话,再高的频率就是噪音了,除去这些高频信号,然后通过逆变换就可以得到处理后的音频。

在声音中,那刚才的傅里叶变换之前的x轴就是时间,y轴就是声音的振幅

如下图(copy from 知乎Heinrich)
在这里插入图片描述

- 图像

通过分析频率域,他的低频部分可能就是画像的主体部分,高频部分可能是图像中的噪点,比如说是画面中的斑点噪音,旧照片中的斑点,通过去掉高频信号,然后逆变换回去,就得到去除噪点之后的图像。

在图像中,傅里叶变换之前的x轴就是图像的空间坐标位置,y轴就是他的灰度???

5.OpenCV ,Numpy中的操作一下

-numpy中操作
  1. np.fft.fft2

    实现傅里叶变换并且返回一个复数数组

  2. np.fft.fftshift

    将零频率分量移动到频谱的中心

  3. np.log(np.abs(fshift))

    刚才返回的复数数组没办法用图像的形式展示出来需要用以上函数转换到[0, 255]范围

  4. np.fft.ifftshift

    把中心化的频谱再移动回左上角

  5. np.fft.ifft2

    实现逆变换,返回一个复数数组

  6. np.abs(逆傅里叶变换的结果)

​ 变回能显示的[0, 255]的可显示图像

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 直接读为灰度图像
img = cv2.imread('你电脑本地的图像路径', 0)  
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 取绝对值:将复数变化成实数
# 取对数的目的为了将数据变化到0-255
s1 = np.log(np.abs(fshift))
plt.subplot(131), plt.imshow(img, cmap='gray', interpolation='bicubic'), plt.title('original')
plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(s1, 'gray', interpolation='bicubic'), plt.title('center')
plt.xticks([]), plt.yticks([])
# 逆变换
f1shift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f1shift)
# 出来的是复数,无法显示
img_back = np.abs(img_back)
plt.subplot(133), plt.imshow(img_back, cmap='gray', interpolation='bicubic'), plt.title('img back')
plt.xticks([]), plt.yticks([])
plt.show()
OpenCV中操作
  1. 返回结果 = cv2.dft(原始图像, 转换标识)

    返回结果是双通道的,第一通道是结果的实数部分,第二通道是虚数部分

    原始图像一般是整型八位位图,要转换成32位的(np.float32(img))

    转换标识一般flags = cv2.DFT_COMPLEX_OUTPUT,输出一个复数阵列

  2. np.fft.fftshift

    将零频率分量转换频谱中心

  3. 返回值 = cv2.magnitude(参数1,参数2)

    参数1:浮点的X坐标,也就是实部

    参数2:浮点的Y坐标,也就是虚部

    通过这个函数,将那个复数转换到[0, 255]

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('电脑本地的图像地址'0)
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
result = 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))
ishift = np.fft.ifftshift(dftshift)
iimg = cv2.idft(ishift)
iimg = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])
plt.subplot(221), plt.imshow(img,'gray')
plt.title('img'), plt.axis('off')
plt.subplot(222), plt.imshow(result,'gray')
plt.title('result'), plt.axis('off')
plt.subplot(223), plt.imshow(img, 'gray')
plt.title('img'), plt.axis('off')
plt.subplot(224), plt.imshow(iimg, 'gray')
plt.title('result'), plt.axis('off')
plt.show()


低通滤波
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('/Users/star/learning_python/picture/2.png', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dshift = np.fft.fftshift(dft)
rows, cols = img.shape
row, col = int(rows/2), int(cols/2)
mask = np.zeros((rows, cols, 2), np.uint8)
mask[row-50:row+50, col-50:col+50] = 1
dst = dshift * mask
idst = np.fft.ifftshift(dst)
ishift = cv2.idft(idst)
idst = cv2.magnitude(ishift[:, :, 0], ishift[:, :, 1])
plt.subplot(121), plt.imshow(img, 'gray')
plt.title('img'), plt.axis('off')
plt.subplot(122), plt.imshow(idst, 'gray')
plt.title('img'), plt.axis('off')
plt.show()
高通滤波
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('电脑本地的图像地址'0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)		
rows,cols = img.shape[:2]
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
plt.subplot(121),plt.imshow(img, 'gray')
plt.title('img'),plt.axis('off')
plt.subplot(122),plt.imshow(iimg, 'gray')
plt.title('iimg'),plt.axis('off')
plt.show()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图像处理——我理解的傅里叶变换 的相关文章

  • 尝试捕获默认 iSight 相机时 OpenCV 崩溃

    我正在尝试让 openCV 在我的 Macbook Pro 10 8 5 视网膜型号 上运行 并且我想使用默认的 iSight 摄像头进行输入 因为如果我不这样做 我不想随身携带或购买 USB 摄像头不需要 我正在使用 OpenCV 用户文
  • 使用 OpenCV 进行车牌识别

    我有一个项目 需要使用 OpenCV 识别汽车的车牌 我想加载数字或字母的图像 让 OpenCV 识别它并将其打印到控制台 有一个函数可以做到这一点吗 如果没有 我该怎么办 Note 我正在研究灰度级 请帮忙 我必须在一周后完成 谢谢你的快
  • 如何在win32上安装OpenCV 2.0

    我需要在 Win32 上安装 OpenCV 我目前没有安装它 我下载了 OpenCV 2 0 0a win32 exe 并运行它 我现在到底该怎么办 没有 lib之类的东西 我找到了一些使用 cmake 构建版本的说明 http openc
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 如何使用 OpenCV 找到红色区域? [复制]

    这个问题在这里已经有答案了 我正在尝试编写一个检测红色的程序 然而有时它比平常更暗 所以我不能只使用一个值 检测不同深浅的红色的最佳范围是多少 我目前使用的范围是 128 0 0 255 60 60 但有时它甚至检测不到我放在它前面的红色物
  • C++ OpenCV imread 无法在 Android 中工作

    我正在尝试读取 C 代码中的图像 LOGD Loading image s n inFile c str Mat img imread inFile CV LOAD IMAGE GRAYSCALE CV Assert img data 0
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • 如何将 OpenCV 等待键与 Chaquopy 一起使用

    我正在尝试使用 Chaquopy 将计算机视觉应用程序移植到 Android 当我尝试运行脚本时 以下行中出现以下错误 cv2 waitKey 100 打印到嵌入式 python 控制台的错误是 java chaquopy CQPEnv c
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • opencv如何使用compareHist函数

    img cv2 imread mandrill png histg cv2 calcHist img 0 None 256 0 256 if len sys argv lt 2 print gt gt sys stderr Usage sy
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • 使用 openCV 和 python 检测物体

    我正在尝试使用 OpenCV 和 Python 检测下图中的白点 我尝试使用函数 cv2 HoughCircles 但没有成功 我需要使用不同的方法吗 这是我的代码 import cv2 cv import numpy as np impo
  • 计算两个描述符之间的距离

    我正在尝试计算已计算的两个描述符之间的距离 欧几里得或汉明 问题是我不想使用匹配器 我只想计算两个描述符之间的距离 我正在使用 OpenCV 2 4 9 并且我的描述符存储在 Mat 类型中 Mat descriptors1 Mat des
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • Python中最相似的人脸识别

    如何使用Python和OpenCV来查找面部相似 我已成功使用 OpenCV 和 Python 使用 Haar Cascades 从多张照片中提取人脸 我现在有一个图像目录 所有这些都是不同人的面孔 我想做的是拍摄一张样本图像 然后看看它最
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 多视图几何

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg

随机推荐

  • 【廖雪峰python入门笔记】字符串_转义字符的使用

    转义字符的使用 字符串可以用 或者 括起来表示 如果字符串本身包含 怎么办 比如我们要表示字符串 I m OK 这时 可以用 括起来表示 I m OK 类似的 如果字符串包含 我们就可以用 括起来表示 Learn Python in imo
  • Qt 教程(传智教育)

    1 一个简单的 Qt 应用程序 Qt一个类对应一个头文件 类名就是头文件名 QApplication 应用程序类 管理图形用户界面应用程序的控制流和主要设置 是 Qt 的整个后台管理的命脉 它包含主事件循环 在其中来自窗口系统和其它资源的所
  • 快速排序(三种算法实现和非递归实现)

    快速排序 Quick Sort 是对冒泡排序的一种改进 基本思想是选取一个记录作为枢轴 经过一趟排序 将整段序列分为两个部分 其中一部分的值都小于枢轴 另一部分都大于枢轴 然后继续对这两部分继续进行排序 从而使整个序列达到有序 递归实现 v
  • (转)原理到实现

    转 https mp weixin qq com s Mrr1Rnl 594Gyyn9fHekjw 1NFS介绍 NFS是Network File System的简写 即网络文件系统 NFS是FreeBSD支持的文件系统中的一种 NFS基于
  • opencv中resize错误可能导致的原因之一

    cv2 error OpenCV 4 5 5 1 error 5 Bad argument in function resize 在用resize时会产生这个错误 有可能时传入的图片不存在了 假如你是从摄像头读取的图片 需要通过 ret f
  • vue 子父组件间的那些事儿——搭建项目(一)

    一 搭建vue项目 1 环境准备 基于nodejs vue cli cnpm 搭建vue项目 由于本博主已经具备以上环境 现在直接进行项目搭建 环境准备可参考这篇博客 https blog csdn net xcymorningsun ar
  • uni-app使用CSS实现无限旋转动画

    本来想用uni createAnimation创建一个旋转动画 发现转完一圈后就不动了 没法循环旋转 后来又用setInterval每隔一个周期就把旋转角度加180度 发现运行一段时间后动画逐渐崩坏 应该是动画的周期和定时器的周期时间没有完
  • 为什么重写equals就要重写hashcode

    在学习java的时候常常提到 重写equals就要重写hashcode hashcode和equals是个绑定在一起的东西 要了解这个我们需要了解两个函数 hashCode 方法 散列码 hash code 是由对象导出的一个整型值 散列码
  • js 设置网页打印的页眉页脚和页边距

    http blog sina com cn s blog 629788b70100n9zr html
  • React 教程及其API接口文档

    React 详细中文开发文档 可以阅读 http reactjs cn react docs tutorial html 英文原文 http facebook github io react 中文论坛 http react china or
  • mmdetection No module named 'imagecorruptions'

    报错原因 imagecorruptions cpp文件需要重新编译 解决方案 mmdetection 目录下运行 python setup py develop
  • 权重计算方法_终身持续学习-可塑权重巩固(Elastic Weight Consolidation)

    回过头来梳理了一下EWC方法 在持续终身学习里面很经典的一个方法 Deepmind写的晦涩难懂x 当时折腾了好久才理解 因为自己有点菜 条件和目标 论文中 假设存在两个任务A和B 可以推广为旧任务和新任务 数据集分别为D和D 模型学习完任务
  • 2021-07-01 RuoYi-Vue-Plus

    提示 https gitee com JavaLionLi RuoYi Vue Plus from gitee search 疯狂的狮子li icon https www iconfont cn 渐变色 http color oulu me
  • ASP.NET 中实现 读取数据库二进制 下载

    实现思路 首先从数据库中把二进制 写入到服务器上 生成临时文件 然后再从服务器上 进行下载 具体代码如下 string filename test jpg 这个就是要存放到服务器的文件名 Response ContentType appli
  • Jenkins自动化测试

    学习 Jenkins 自动化测试的系列文章 Robot Framework 概念 Robot Framework 安装 Pycharm Robot Framework 环境搭建 Robot Framework 介绍 Jenkins 自动化测
  • mariadb主从复制

    1 准备两台服务器 一台设置为master服务器 一台设置为slave服务器 两台服务器先关闭防火墙 关闭selinux systemctl stop firewalld setenforce 0 两台服务器都需要安装mariadb 这里用
  • google c++代码规范-中文翻译

    头文件 lt Header Files gt The define Guard 所有的头文件都应该使用 define等来防止头文件重复包含 宏的格式应该为
  • Python实现二叉搜索树的删除功能

    Python实现二叉搜索树的删除功能 二叉搜索树 二叉查找树 Binary Search Tree 又称为排序二叉树 有序二叉树 二叉搜索树的实现可以参考 https blog csdn net weixin 43790276 articl
  • 标准正态分布变量的积累概率分布函数C\C++

    BS模型中用到的CDF函数实现 找到两种常见的实现方式 实现一 include
  • 图像处理——我理解的傅里叶变换

    1 傅里叶变换的理解 傅里叶变换的相关数学公式目前还没有搞懂 先不整那个东西 我们主要是研究傅里叶变换的一些思想和应用 这个思想起源于牛顿研究那个三棱镜 白光透过棱镜之后会被分解为七种颜色的光 这些光叠加又能形成白光 所以说可以把一种事物分