Python_OpenCV傅里叶变换

(一)、什么是傅里叶变换

我们生活在时间的世界中,早上700起来吃早饭,800去挤地铁,900开始上班。。。以时间为参照就是时域分析。但是在频域中—切都是静止的。

傅里叶变换的作用:
高频:变化剧烈的灰度分量,例如边界。
低频:变化缓慢的灰度分量,例如一片大海。
滤波:
低通滤波器:只保留低频,会使得图像模糊。
高通滤波器:只保留高频,会使得图像细节增强。
——opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32 格式。
——得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。——cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。

(二)、理论部分

1、什么是频域

频域(frequency domain)是描述信号在频率方面特性时用到的一种坐标系。
傅里叶同学告诉我们,任何周期函数,都可以看作是不同振幅,不同相位正弦波的叠加。


周期函数

你眼中看似落叶纷飞变化无常的世界,实际只是躺在上帝怀中一份早已谱好的乐章。

2、正弦波的叠加过程

正弦波的叠加:随着叠加的递增,所有正弦波中上升的部分逐渐让原本缓慢增加的曲线不断变陡,而所有正弦波中下降的部分又抵消了上升到最高处时继续上升的部分使其变为水平线。


频域与时域

对信号进行分析时通常采用传统的傅立叶变换方法,傅立叶变换是时域和频域相互转换的数学工具,从物理意义上讲其实质是将信号分解成许多不同频率的正弦波的叠加。
图解

用Python进行绘图:

import matplotlib.pyplot as plt
import numpy as np

# 定义X
x = np.arange(-3.14, 3.14, 0.02)
# 定义Y
y1 = np.sin(x)
y2 = 1 / 3 * np.sin(3 * x)
y3 = 1 / 5 * np.sin(5 * x)
y4 = 1 / 7 * np.sin(7 * x)
# 正弦波的叠加
y_plus_2 = y1 + y2
y_plus_3 = y1 + y2 + y3
y_plus_4 = y1 + y2 + y3 + y4
# 绘制函数图像
fig = plt.figure()
ax1 = fig.add_subplot(221)  # top left
ax2 = fig.add_subplot(222)  # top right
ax3 = fig.add_subplot(223)  # bottom left
ax4 = fig.add_subplot(224)  # bottom right
ax1.plot(x, y1)
ax2.plot(x, y_plus_2)
ax3.plot(x, y_plus_3)
ax4.plot(x, y_plus_4)
plt.show()
输出图像

(三)、频域变换结果

1、cv2.dft(img, cv2.DFT_COMPLEX_OUTPUT):进行傅里叶变化
参数说明: img表示输入的图片, cv2.DFT_COMPLEX_OUTPUT表示进行傅里叶变化的方法

2、np.fft.fftshift(img):将图像中的低频部分移动到图像的中心
参数说明:img表示输入的图片

3、cv2.magnitude(x, y):将sqrt(x^2 + y^2) 计算矩阵维度的平方根
参数说明:需要进行x和y平方的数

4、np.fft.ifftshift(img):进图像的低频和高频部分移动到图像原来的位置
参数说明:img表示输入的图片

5、cv2.idft(img):进行傅里叶的逆变化
参数说明:img表示经过傅里叶变化后的图片

傅里叶变化:将图像从空间域转换为频率域, 下面是傅里叶变化的公式

傅里叶变化

程序测试:

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

# 第一步读取图片
img = cv2.imread("img/test01.jpg", 0)

# 第二步:进行float32形式转换
float32_img = np.float32(img)

# 第三步: 使用cv2.dft进行傅里叶变化
dft_img = cv2.dft(float32_img, flags=cv2.DFT_COMPLEX_OUTPUT)

# 第四步:使用np.fft.shiftfft()将变化后的图像的低频转移到中心位置
dft_img_ce = np.fft.fftshift(dft_img)

# 第五步:使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
img_dft = 20 * np.log(cv2.magnitude(dft_img_ce[:, :, 0], dft_img_ce[:, :, 1]))

# 第六步:进行画图操作
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.subplot(122)
plt.imshow(img_dft, cmap='gray')
plt.show()
输出结果

(四)、低通与高通滤波

只保留低频/高频,即进行低通滤波,因为高频表示是一些细节,即图像的轮廓和边缘,失去了高频部分,图像就容易变得模糊
图解

第一步:读取图片

第二步:np.float32进行类型转换

第三步:使用cv2.dft进行傅里叶变化

第四步:使用np.fft.fftshift 将低频/高频部分转换到图像的中心

第五步:构造掩模,使得掩模的中心位置为1,边缘位置为0

第六步:将掩模与傅里叶变换后的图像结合,只保留中心部分的低频/高频位置

第七步:使用np.fft.ifftshift将低频部分转移回图像的原先位置

第八步:使用cv2.idft进行傅里叶的反转换

第九步:使用cv2.magnitude将图像的实部和虚部转换为空间域内

第十步:进行作图操作

程序测试:

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

# 第一步读取图片
img = cv2.imread("img/test01.jpg", 0)

# 第二步:进行数据类型转换
img_float = np.float32(img)
# 第三步:使用cv2.dft进行傅里叶变化
dft = cv2.dft(img_float, flags=cv2.DFT_COMPLEX_OUTPUT)
# 第四步:使用np.fft.fftshift将低频转移到图像中心
dft_center = np.fft.fftshift(dft)

# 第五步:定义掩模:生成的掩模中间为1周围为0,这是保留低频区域
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2)  # 求得图像的中心点位置
mask_low = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
mask_low[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

mask_hight = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask_hight[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0

# 第六步:将掩模与傅里叶变化后图像相乘
# 保留中间部分 低通滤波器
mask_img_low = dft_center * mask_low
# 保留周围部分 高通滤波器
mask_img_hight = dft_center * mask_hight

# 第七步:使用np.fft.ifftshift
img_idf_low = np.fft.ifftshift(mask_img_low)  # (将低频移动到原来的位置)
img_idf_hight = np.fft.ifftshift(mask_img_hight)  # (将高频移动到原来的位置)

# 第八步:使用cv2.idft进行傅里叶的反变化
img_idf_low = cv2.idft(img_idf_low)
img_idf_hight = cv2.idft(img_idf_hight)

# 第九步:使用cv2.magnitude转化为空间域内
img_idf_low = cv2.magnitude(img_idf_low[:, :, 0], img_idf_low[:, :, 1])
img_idf_hight = cv2.magnitude(img_idf_hight[:, :, 0], img_idf_hight[:, :, 1])

# 第十步:进行绘图操作
plt.subplot(221)
plt.imshow(img, cmap='gray')
plt.subplot(222)
plt.imshow(img_idf_low, cmap='gray')
plt.subplot(223)
plt.imshow(img_idf_hight, cmap='gray')
plt.show()
输出结果

为什么要转换到一个频域当中做处理?
当你检测图片中那些是高频的那些事低频的,在原始图形中做起来特别麻烦,但是如果转换到傅里叶变换的频域当中,这个频域当中的低频和高频层次分明,在这里面做变换特别容易。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容