图像中的傅里叶变换的实现
在Opencv中对图片的处理一般都会应用到傅里叶变换的概念,其实以前在学习信号处理时应用到这个概念.一般而言,傅里叶变换的实质是指观察得到所有的波形都可以由一系列简单且不同频率的正弦波叠加而来.但是这个概念应用在图像处理上有什么用呢?其实图像也是信号的一种表达形式,我们常见的图像其实就是二维的离散信号,可以将图像理解为二维矩阵,里面的元素就是像素值.,一张原始图片往往由许多频率组成,比如说在目标边缘处像素值的变换一般比较强,即某一个像素点与邻处像素点的像素值差异比较大;或者也有差异小的点.这样,我们先来理解两个概念:
- 图像的频率:用于表征图像中灰度变化剧烈程度的指标.图像中高低频部分是指与邻域点像素差异的强弱(梯度的大小),一般梯度越大,在频谱中亮度就越强.如果一张图片中低频部分越多,图像相对来说就比较柔和.
- 幅度谱:图像经过傅里叶变换后,会得到幅度谱,幅度谱其实是另外一种图像,是原始图像在变化方面的一种表征.一般是把一张图像中最亮的像素放在幅度谱正中央,然后逐渐变暗.从而可以较为直观的显示原始图像中亮暗像素所占的比例.
基于python语言实现
这里我选用了一张测试图片,直观的展示一下实验结果:
——————-
import cv2
import numpy as np
from matplotlib import pyplot as plot##安装方式:pip install matplotlib或者conda install matplotlib(anaconda安装方式)
img = cv2.imread('/home/pandamax/techfort-pycv/chapter3/test.jpg', 0)##读入图像的路径
f = np.fft.fft2(img)#二维傅里叶变换
#fshift = f
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))##幅度谱
#置中
row, cols = img.shape
print(row,cols)
crow, ccol = row / 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.abs(img_back)#取模
##绘图
plot.subplot(221), plot.imshow(img, cmap = "gray")
plot.title("Input"), plot.xticks([]), plot.yticks([])
plot.subplot(222), plot.imshow(magnitude_spectrum, cmap = "gray")
plot.title('magnitude_spectrum'), plot.xticks([]), plot.yticks([])
plot.subplot(223), plot.imshow(img_back, cmap = "gray")
plot.title("Input in JET"), plot.xticks([]), plot.yticks([])
plot.show()
以下是实验结果:
其实,总的来说,对图像的傅里叶变换处理是我们理解图像所包含的意义的一种方式,从数学角度来直观理解各个像素与像素之间的关系.从而经过分析,我们可以实现其他的图像操作.