1. 快速傅里叶变换(FFT)

原始二维傅里叶变换公式:

np工具箱中有fft2函数可以对图像做二维快速傅里叶变换(不断分解成更小的、更容易的小蝶形变换替换大变换),但是要让输出的频谱图更有视觉效果,需要把四个角的中心点移动到矩阵中心,并做对数变换

代码:

import numpy as np
import cv2
import matplotlib.pyplot as pltdef FFT(path):img = plt.imread(path)plt.subplot(121)plt.imshow(img)plt.title('img')# 转化为灰度图img = 0.2126 * img[:,:,0] + 0.7152 * img[:,:,1] + 0.0722 * img[:,:,2]# 快速傅里叶变换img_fft = np.fft.fft2(img)# 原点移动img_fft = np.fft.fftshift(img_fft)# 对数变换img_fft = np.log(1 + np.abs(img_fft))plt.subplot(122)plt.imshow(img_fft,'gray')plt.title('img_fft')plt.show()FFT('man.jpg')

输出图像:(原图由网上下的人物图)

2. 离散余弦变换

原始二维离散余弦变换:

cv2工具箱中有dct函数可以实现对图像的二维离散余弦变换,通过经过对数变换可以更好地观察

代码:

import numpy as np
import cv2
import matplotlib.pyplot as pltdef DCT(path):img = cv2.imread(path, 0)img = img.astype('float32')plt.subplot(121)plt.imshow(img, cmap='gray')plt.title('img_gray')# 离散余弦变换img_dct = cv2.dct(img)# 对数变换img_dct = np.log(1+ np.abs(img_dct))plt.subplot(122)plt.imshow(img_dct, cmap='gray')plt.title('img_dct')plt.show()DCT('man.jpg')

输出图像:

3. 相位谱、幅度谱结合

3.1. 相位谱、幅度谱提取:

相位谱、幅度谱定义:

代码:

import numpy as np
import cv2
from matplotlib import pyplot as pltdef magnitude_phase_split(img):# 分离幅度谱与相位谱dft = np.fft.fft2(img)dft_shift = np.fft.fftshift(dft)# 幅度谱magnitude_spectrum = np.abs(dft_shift)# 相位谱phase_spectrum = np.angle(dft_shift)return magnitude_spectrum,phase_spectrum

3.2. 不同图像的相位、幅度谱交替结合

图1的幅度谱和图2的相位谱结合,重构图像以图2信息为主

图2的幅度谱和图1的相位谱结合,重构图像以图1信息为主

代码:

def magnitude_phase_combine(img_m,img_p):# 不同图像幅度谱与相位谱结合img_mandp = img_m*np.e**(1j*img_p)# 图像重构img_mandp = np.uint8(np.abs(np.fft.ifft2(img_mandp)))img_mandp =img_mandp/np.max(img_mandp)*255return img_mandp# 读取图像 主图和纹理图
img1 = cv2.imread("man.jpg",0)
img2= cv2.imread("rock1.jpg",0)# 分离幅度谱与相位谱
img1_m,img1_p = magnitude_phase_split(img1)
img2_m,img2_p = magnitude_phase_split(img2)# 合并幅度谱与相位谱
# 主图的幅度谱+纹理图的相位谱 以纹理图为主
img_1mAnd2p = magnitude_phase_combine(img1_m,img2_p)
# 纹理图的幅度谱+主图的相位谱 以主图为主
img_2mAnd1p = magnitude_phase_combine(img2_m,img1_p)plt.figure(figsize=(10,8))
plt.subplot(321)
plt.xlabel("man")
plt.imshow(img1,cmap="gray")
plt.subplot(322)
plt.imshow(img2,cmap="gray")
plt.xlabel("rock")
plt.subplot(323)
plt.imshow(img_1mAnd2p,cmap="gray")
plt.xlabel("man_and_rock_p")
plt.subplot(324)
plt.imshow(img_2mAnd1p,cmap="gray")
plt.xlabel("rock_m_and_man_p")
plt.show()

输出结果:

3.3. 不同图像相应谱结合实现艺术效果

由于相位谱内容占比决定最终图像中的信息占比,则通过加权相加并调节权重,可以实现在主图的基础上结合纹理图的纹理信息,从而得到艺术效果

代码:

def magnitude_phase_add(img1_m, img2_m, img1_p, img2_p):# 不同图像幅度谱和相位谱对应加权相加img_m = img1_m * 0.4 + img2_m * 0.6img_p = img1_p * (np.sum(img2_p) / (np.sum(img1_p) + np.sum(img2_p))) + img2_p * (np.sum(img1_p) / (np.sum(img1_p) + np.sum(img2_p)))# 图像重构img = img_m * np.e ** (1j * img_p)img = np.uint8(np.abs(np.fft.ifft2(img)))img = img / np.max(img) * 255return img# 读取图像 主图和纹理图
img1 = cv2.imread("cqh.jpg",0)
img2= cv2.imread("rock1.jpg",0)# 分离幅度谱与相位谱
img1_m,img1_p = magnitude_phase_split(img1)
img2_m,img2_p = magnitude_phase_split(img2)# 合并幅度谱与相位谱
# 主图和纹理图相应谱加权像家 以主图为主,以纹理图为辅,形成艺术效果
img_add = magnitude_phase_add(img1_m, img2_m, img1_p, img2_p)plt.figure(figsize=(10,8))
plt.subplot(221)
plt.xlabel("cqh")
plt.imshow(img1,cmap="gray")
plt.subplot(222)
plt.imshow(img2,cmap="gray")
plt.xlabel("rock")
plt.subplot(223)
plt.imshow(img_add,cmap="gray")
plt.xlabel("artistic imgage")
plt.show()

输出结果:

参考博文:

两幅图像幅度谱和相位谱替换_陨星落云的博客-CSDN博客

Python-opencv fft、dct变换 + 幅度、相位谱结合实现艺术效果相关推荐

  1. Python+OpenCV:形态学变换

    Python+OpenCV:形态学变换 理论 形态学变换是基于图像形状的一些简单操作. 它通常在二值图像上执行.它需要两个输入,一个是我们的原始图像,另一个是结构元素(structuring elem ...

  2. matlab画傅立叶变换后相位谱,对一幅图像进行傅里叶变换后,包含频谱(也叫幅度谱)和相位谱两部分,请问那一部分更重要?...

    对一幅图像进行傅里叶变换后,包含频谱(也叫幅度谱)和相位谱两部分,请问那一部分更重要? 更多相关问题 [判断题] 抗盐产品切换到中分时,生产线不需要酸洗. [判断题] 机械密封中的载荷系数不是越大越好 ...

  3. 离散信号经过FFT处理后,幅度,相位,功率的计算

    <1> : 每点对应的实际幅度等于fft后对应点实部和虚部的平方根再乘以2/N,N是采样点数,不过直流分量即第一点须除N 幅值:(假设你只须分析x次以下谐波) for(i=0;i<x ...

  4. 图像变换——(DFT、DCT变换,IDFT、IDCT重建)

    目的:对图像进行离散傅立叶变换(DFT).离散余弦变换(DCT)变换,并对图像傅立叶变换的结果进行必要解释,使用IDFT.IDCT对图像进行重建,分析重建后的图像.操作过程中获取两帧图像,对这两帧图像 ...

  5. python opencv 常用增强 dct变换+侵蚀+扩张+索贝尔算子+直方图均衡化+光照平衡+

    裁剪操作 img=img[100:200,:,:] 通道置零 img[:,:,2]=0 侵蚀 扩张 frame = cv2.erode(frame, kernel=np.ones((5, 5))) # ...

  6. fft 相位谱_信号处理之功率谱原理与python实现

    点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 功率谱图又叫功率谱密度图 功率谱是功率谱密度函数的简称,它定义为单位频带内的信号功率.它表示了信号功率随着频率的变化情况 ...

  7. 频谱分析:c和python对比FFT的效率并画出幅度谱

    一.c语言编写的FFT程序 c语言程序 正弦波表达式为: s(t) = 0.6 sin( 2π 50t ) 和s(t) = 0.6 sin( 2π 500t ) 频率为8000Hz,近似为8192 F ...

  8. OPenCV:傅里叶变换、时域和频域、频谱和相位谱、傅里叶级数、离散傅里叶变换(DFT)、频域滤波、高通和低通滤波器、带通和带阻滤波器

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 快速了解傅立叶变换(播放PPT即能动态地显示gif图)    ...

  9. 用FFT求信号相位谱

    先看一下我收到的程序,作为研究对象的信号是这样产生的:      T=128;      N=128;      dt=T/N;      t=dt*(1:N);      x=2*cos(2*t-p ...

最新文章

  1. mysql 表空间收缩_mysql表碎片清理和表空间收缩
  2. python写计算器
  3. Dart Metadata 使用
  4. 自定义的代码块怎么移到别的电脑上
  5. python可以自学吗-python可以自学吗
  6. 云计算概念诠释:18个权威人士的定义
  7. Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
  8. 1058 选择题 (20 分)
  9. java null转换jason_常见java问题及解决办法汇总(干货可收藏)
  10. hnust 神奇的序列
  11. 51单片机冒泡排序_51单片机片外冒泡排序
  12. html如何去掉有无标题点,HTML中,如何去掉某个元素下的一些特殊标签?
  13. 【FXCG】如何成功启动SWOT分析法
  14. HDU 1698 Just a Hook(线段树区间更新)
  15. 【吐血整理】java程序员推荐轻薄笔记本
  16. Unity实现圆形旋转滚动视图
  17. ZYNQ有两个CPU?(二)——OCM共享内存
  18. 图神经网络(三):节点分类
  19. 串口打印乱码问题处理
  20. 赢得面试 — 天助自助者

热门文章

  1. linux环境下安装nodeJS
  2. iOS开发~UI布局(三)深入理解autolayout
  3. 5W无线充方案,无线充方案,手机无线充
  4. ArcGIS教程:更改标题的文本和样式
  5. (c语言)Saving James Bond - Hard Version (30分)
  6. css球形颜色选择器,在CSS选择器中使用color颜色样式CSS代码
  7. 电影/商品 推荐的两种经典算法
  8. 2021-11-09 祖玛游戏
  9. Rust FFI 编程 - bindgen 使用示例
  10. java计算机毕业设计拍卖网站源码+程序+lw文档+mysql数据库