对一张图片进行傅里叶变换处理

原为url:https://www.cnblogs.com/my-love-is-python/p/10406038.html

效果图:
在这里插入图片描述

from turtle import shape
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt


# 傅里叶变化--将图像从空间域转换为频率域
# 通常呈现中间亮,周围暗,是因为对于低频而言,波动较大,因此呈现亮,对于高频而言,波动较小,因此呈现暗

# 读取图片
img=cv2.imread('images/1.png',0)
# 进行float32形式转换
float32_img = np.float32(img)
# 进行傅里叶变化
dft=cv2.dft(float32_img,flags=cv2.DFT_COMPLEX_OUTPUT)
# 将图像中的低频部分移动到图像的中心
dftshift=np.fft.fftshift(dft)
# 使用cv2.magnitude将实部和虚部转换为实部,乘以20是为了使得结果更大
result=20*np.log(cv2.magnitude(dftshift[:,:,0],dftshift[:,:,1]))

plt.subplot(331), plt.imshow(img, cmap='gray')
plt.title('original'),plt.axis('off')
plt.subplot(332),plt.imshow(result,cmap='gray')
plt.title('fftImage'), plt.axis('off')


# 只保留低频,即进行低通滤波,因为高频表示是一些细节,即图像的轮廓和边缘,失去了高频部分,图像就容易变得模糊
# 求得图像的中心点位置
crow, ccol = int(img.shape[0] / 2), int(img.shape[1] / 2) 
# 定义掩模:生成的掩模中间为1周围为0
mask_withlow = np.zeros((img.shape[0], img.shape[1], 2), np.uint8)
masklen = 50
mask_withlow[crow-masklen:crow+masklen, ccol-masklen:ccol+masklen] = 1
# 将掩模与傅里叶变化后图像相乘,保留掩膜为1的部分
mask_lowimg = dftshift * mask_withlow
result2=20*np.log(cv2.magnitude(mask_lowimg[:,:,0],mask_lowimg[:,:,1]))

# 使用np.fft.ifftshift 将低频移动到原来的位置
imglow_idf = np.fft.ifftshift(mask_lowimg)
# 使用cv2.idft进行傅里叶的反变化
imglow_idf = cv2.idft(imglow_idf)
# 使用cv2.magnitude转化为空间域内
imglow_idf = cv2.magnitude(imglow_idf[:, :, 0], imglow_idf[:, :, 1])


plt.subplot(334),plt.imshow(result2,cmap='gray')
plt.title('fftImageWithLow'), plt.axis('off')

plt.subplot(335),plt.imshow(imglow_idf,cmap='gray')
plt.title('rfftImageWithLow'), plt.axis('off')


# 保留图像的高频部分
mask_withHigh = np.ones((img.shape[0], img.shape[1], 2), np.uint8)
mask_withHigh[crow-masklen:crow+masklen, ccol-masklen:ccol+masklen] = 0

mask_highimg = dftshift * mask_withHigh
result3=20*np.log(cv2.magnitude(mask_highimg[:,:,0],mask_highimg[:,:,1]))

imghigh_idf = np.fft.ifftshift(mask_highimg)
imghigh_idf = cv2.idft(imghigh_idf)
imghigh_idf = cv2.magnitude(imghigh_idf[:, :, 0], imghigh_idf[:, :, 1])

plt.subplot(337),plt.imshow(result3,cmap='gray')
plt.title('fftImageWithHigh'), plt.axis('off')

plt.subplot(338),plt.imshow(imghigh_idf,cmap='gray')
plt.title('rfftImageWithHigh'), plt.axis('off')


plt.show()

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要将一张图片进行傅里叶变换后再转回时域,可以使用matlab中的ifft2函数。具体步骤如下: 1. 读入图片并将其转换为灰度像。 2. 对进行二维傅里叶变换,使用fft2函数。 3. 对变换后的频域进行处理,例如对其进行滤波或者对其进行频域像的可视化。 4. 对处理后的频域进行逆变换,使用ifft2函数。 5. 对逆变换后的时域进行处理,例如进行灰度值范围的截断或者进行像的归一化。 6. 将处理后的时域像保存为像文件或者直接显示。 下面是matlab代码示例: ```matlab % 读入图片并将其转换为灰度像 img = imread('lena.png'); img = rgb2gray(img); % 对进行二维傅里叶变换 F = fft2(double(img)); % 对变换后的频域进行处理,这里选择对其进行频域像的可视化 F_shift = fftshift(F); F_abs = log(abs(F_shift)+1); F_max = max(F_abs(:)); F_norm = F_abs/F_max; figure, imshow(F_norm); % 对处理后的频域进行逆变换 img_recover = ifft2(F); % 对逆变换后的时域进行处理 img_recover = uint8(real(img_recover)); % 显示原始像和恢复后的像 figure, imshow(img); figure, imshow(img_recover); ``` 注意,进行傅里叶变换和逆变换时,需要将像转换为双精度浮点型,即使用`double()`函数进行类型转换。逆变换后的时域像可能会存在虚部,需要使用`real()`函数取其实部,再将其转换为无符号整型,即使用`uint8()`函数进行类型转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力减肥的小胖子5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值