文章目录
- 1、傅里叶变换
- 2、通过numpy实现
- 3、高通滤波器
- 5、通过opencv实现傅里叶变换
- 6、低通滤波器
1、傅里叶变换
时域分析:以时间作为参照物,世间万物都是随着时间变化而变化,并且不会停止
频域分析:认为世间万物都是静止的,永恒不变的
通过以下制作饮料的过程可以很好的理解傅里叶变换。
1、从时域分析:就是六点零一放了1块冰糖,3颗红豆,2颗绿豆,4块西红柿,1杯纯净水,六点零二放了1块冰糖。。。。随着时间的变化一直在变化
2、从频域角度分析:不在是以时间为参照物了,而是这个事情的频率,1分钟放1块冰糖,2分钟放3粒红豆,3分钟放2粒绿豆,4分钟放4块西红柿,5分钟放1杯水。
下面这两个图都是描述同一个事情,可以更明显看出,两者的区别。
在两个角度去看周期函数的变化
任何连续的周期信号,可以由一组适当的正𫠊曲线组成
相为:三个开始起点不一致的余𫠊函数,组成了这个曲线
2、通过numpy实现
通过将原图进行傅里叶变换,得到频域图像,获得高频和低频,对高频和低频进行操作之后,进行逆变换回原图像达到对图像进行特色操作:图像增强、图像去噪、边缘检测、特征提取、压缩、加密等
1、低通滤波器:只保留低频信息,去掉高频信息,会去掉边缘特征信息,会让图像变模糊
2、高频滤波器:只保留高频信息,去掉低频信息,会增强图像的边缘和特征信息,但是会失去一些细节信息
def test9():
img = cv2.imread("1.jpg", 0)
# 执行傅里叶变换,转化为频域
f = np.fft.fft2(img)
# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
fshift = np.fft.fftshift(f)
# 通过将其转换为(0-255)中
result = 20 * np.log(np.abs(fshift))
# 原图显示
# 创建窗口一行两列,第一咧
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('orginal')
# 不用坐标系
plt.axis('off')
# 傅里叶变换之后的图
plt.subplot(122)
plt.imshow(result, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()
从频域转换会原图像(因为没有做任何操作,所以输出图像不会发生改变)
def test10():
img = cv2.imread("1.jpg", 0)
# 执行傅里叶变换,转化为频域
f = np.fft.fft2(img)
# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
fshift = np.fft.fftshift(f)
# 低频谱从中心移动到左上角(相当于又移回去)
ishift = np.fft.ifftshift(fshift)
# 从频域转换回原图像
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
# 原图显示
# 创建窗口一行两列,第一咧
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('orginal')
# 不用坐标系
plt.axis('off')
# 傅里叶变换之后的图
plt.subplot(122)
plt.imshow(iimg, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()
3、高通滤波器
前面已经说过,高通滤波器是去除所有低频信息,达到图像增强的效果但是会失去一些细节信息。
def test11():
img = cv2.imread("1.jpg", 0)
# 执行傅里叶变换,转化为频域
f = np.fft.fft2(img)
# 低频在左上角,为了方便,将其移到中心位置(带负数的数组)
fshift = np.fft.fftshift(f)
# 高宽 创建高通滤波器
rows, cols = img.shape
crows, ccols = int(rows / 2), int(cols / 2)
# 前面我们将低频信息移动到图像中间来了
# 这里将低频信息全部设置为0,达到去掉低频信息目的
fshift[crows - 30:crows + 30, ccols - 30:ccols + 30] = 0
ifshift = np.fft.ifftshift(fshift)
# 将频谱逆变换到图像
iimg = np.fft.ifft2(ifshift)
iimg = np.abs(iimg)
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('orginal')
# 不用坐标系
plt.axis('off')
# 傅里叶变换之后的图
plt.subplot(122)
plt.imshow(iimg, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()
5、通过opencv实现傅里叶变换
使用opencv中的函数实现
def test12():
img = cv2.imread("1.jpg", 0)
# dft返回的是两个通道的频域,0是频域实部分,1是频域图像虚部分
# DFT_COMPLEX_OUTPUT输出复数
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
idftshift = np.fft.ifftshift(dftshift)
# 傅里叶逆变换
iimg = cv2.idft(idftshift)
# magnitude函数频域图像的幅度谱
# result = 20 * np.log(cv2.magnitude(dftshift[:, :, 0], dftshift[:, :, 1]))
result = cv2.magnitude(iimg[:, :, 0], iimg[:, :, 1])
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('orginal')
# 不用坐标系
plt.axis('off')
# 傅里叶变换之后的图
plt.subplot(122)
plt.imshow(result, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()
6、低通滤波器
创建一个mask,将中心位置设为1,其他位置设为0,然后和频谱图像相乘之后就只保留了低频信息了
def test13():
img = cv2.imread("1.jpg", 0)
# # 执行傅里叶变换
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
ifshift = np.fft.fftshift(dft)
# 创建低通滤波器
rows, cols = img.shape
mask = np.zeros((rows, cols, 2), np.int8)
crows, ccols = int(rows / 2), int(cols / 2)
mask[crows - 30:crows + 30, ccols - 30:ccols + 30] = 1
fshift = ifshift * mask
ishift = np.fft.ifftshift(fshift)
io = cv2.idft(ishift)
result = cv2.magnitude(io[:, :, 0], io[:, :, 1])
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('orginal')
# 不用坐标系
plt.axis('off')
# 傅里叶变换之后的图
plt.subplot(122)
plt.imshow(result, cmap='gray')
plt.title('result')
plt.axis('off')
plt.show()