python opencv 图像转换

图像领域,图像里的振幅变化,在边缘,或者噪点变化最大。所以我们可以说,边缘和噪点是图像里的高频内容。如果在振幅上没特别大变化,就是低频内容

Numpy 里的傅里叶变换

Numpy有一个FFT包来做这个。np.fft.fft2()让我们做频率变换。第一个参数是输入图像,是灰度的,第二个参数是可选的,决定输出数组的大小。如果比输入图像大的话,输入图像会补全0然后再做转换。如果比输入图像小,输入图像会被裁切,如果不传,输出图像大小和输入一样

当你得到了结果,0频率内容会在左上角,如果你想拿到中间来,你需要N/2在两个方向上来移动结果。这个是用函数np.fft.fftshift().当你找到了频率转换,你可以找到振幅谱线。

import cv2
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
img = cv2.imread('touxiang.jpg',0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))

plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

png

你可以看到白色区域在中心,表示低频内容更多。

现在你达到了频率转换,就可以在频率范围内做更多运算了,比如高通过滤和重建图像,比如反向离散傅里叶变换。你只需要通过一个60x60的矩形窗口去掉低频内容,然后用np.fft.ifftshift()做反向变换,0频率内容又在左上角了。然后做反向快速傅里叶变换 np.ifft2()。结果是复数。

rows, cols = img.shape
crow,ccol = rows//2 , cols//2
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0
f_ishift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f_ishift)
img_back = np.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值