java实现图像处理高通滤波,opencv学习笔记22:傅里叶变换,高通滤波,低通滤波...

傅里叶变换原理

任何连续的周期信号,都可以由一组适当的正弦曲线组合而成。

下列左上图由其他三图构成。

7d347c38e16e5c5e47de9374768205c9.png

左图经过傅里叶变换,由时域图转换到频域图。相互可逆

832bb698bda61d8353c845b75b1b0243.png

相位:不是同时开始的一组余弦函数,在叠加时要体现刚开始的时间。

sin(wx+a)中a是相位

numpy实现傅里叶变换

numpy.fft.fft2()

实现傅里叶变换,返回的是一个复数数组。

numpy.fft.fftshift()

将零频域分量移到频谱中心

白色为fft.fft2得到的低频部分。将低频部分移到中心。

4f65f638bbca538554111bcf6e457708.png

20*np.log(np.abs(fshift))

傅里叶得到有负数数据,重新设置频谱的范围如【0-255】,否则图像无法展示。

import cv2

import numpy as np

import matplotlib.pyplot as plt

img = cv2.imread('lena.bmp',0)

f = np.fft.fft2(img)@#傅里叶变换

fshift = np.fft.fftshift(f)#移动低频到中间

magnitude_spectrum = 20*np.log(np.abs(fshift))#设置频谱到【0-255】

plt.subplot(121)

plt.imshow(img, cmap = 'gray')

plt.title('original')

plt.axis('off')

plt.subplot(122)

plt.imshow(magnitude_spectrum, cmap = 'gray')

plt.title('result')

plt.axis('off')

plt.show()

ebd5066b3cc6dc81ea19940cfb7b3417.png

傅里叶变换能得到高频,低频信息。针对低频,高频处理能得到不同的目的。

傅里叶变换是可逆的,逆傅里叶变换能得到原始图像。

在频域对图像进行处理后,在频域处理的结果能反映到逆傅里叶变换图像上。

numpy实现逆傅里叶变换

numpy.fft.ifftshift()

numpy.fft.fftshift()的逆操作

numpyfft.ifft2().

逆傅里叶变换

iimg = np.abs(逆傅里叶变换结果)

逆傅里叶变换也有负数,调整至的范围为[0-255}

import cv2

import numpy as np

import matplotlib.pyplot as plt

img = cv2.imread('boat.bmp',0)

f = np.fft.fft2(img)#傅里叶变换

fshift = np.fft.fftshift(f)#移动位置

ishift = np.fft.ifftshift(fshift)#逆移动位置

iimg = np.fft.ifft2(ishift)#逆傅里叶变换

print(iimg)

iimg = np.abs(iimg)#取绝对值

print(iimg)

plt.subplot(121),plt.imshow(img, cmap = 'gray')

plt.title('original'),plt.axis('off')

plt.subplot(122),plt.imshow(iimg, cmap = 'gray')

plt.title('iimg'),plt.axis('off')

plt.show()

cf97c314e2e24f0b511fe246aab65c1e.png

0c9b76032664b075497386339e8cdaa0.png

b6d2737b1bbd0e4622a72e39c290aa34.png

高通滤波,低通滤波

低频对应图像中变化缓慢的灰度分量,例如在一幅草原图上,低频对应着广袤的颜色趋于一致额草原。

高频对应着图像内变化越来越快的灰度分量,是由灰度的过度尖锐造成的。如对应草原图中狮子的边缘信息。

滤波

接受或者拒绝一定频率的分量

通过低频的滤波器叫低通滤波器

通过高频的滤波器叫高通滤波器

频域滤波

修改傅里叶变换达到特殊目的,然后计算IDFT返回图像域

特殊目的:图像增强,图像去噪,边缘检测,特征提取,压缩,加密等。

低通滤波:衰减高频通低频,会模糊一张图。

高通滤波:衰减低频通高频,增强图像尖锐细节,但是会造成图像对比度下降。

高通滤波numpy实现

高通滤波:将频谱图像的中心的位置区域设置为0(中心部位为低频,之前傅里叶变换将低频移到中心位置啦,由前文得知低频为白色)

67afeae7af7c8c206d61ac0250921b73.png

import cv2

import numpy as np

import matplotlib.pyplot as plt

img = cv2.imread('lena.bmp',0)

f = np.fft.fft2(img)

fshift = np.fft.fftshift(f)

rows, cols = img.shape

crow,ccol = int(rows/2) , int(cols/2)

fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

ishift = np.fft.ifftshift(fshift)

iimg = np.fft.ifft2(ishift)

iimg = np.abs(iimg)

plt.subplot(121),plt.imshow(img, cmap = 'gray')

plt.title('original'),plt.axis('off')

plt.subplot(122),plt.imshow(iimg, cmap = 'gray')

plt.title('iimg'),plt.axis('off')

plt.show()

47c79b7ad70896bc4eec14a220b88f3b.png

opencv实现傅里叶变换

返回结果=cv2.dft(原始图像,转换标识)

返回结果:是双通道的,第一个为结果的实数部分。第二个为结果的虚数部分。

原始图像:要求图像格式是np.float32。得首先转换np.float32(img)

转换标识: 一般使用flags = cv2.DFT_COMPLEX_OUTPUT,输出的是一个复数阵列。

numpy.fft.fftshift(dft)

仍然使用这个将频破谱谱图像低频移到中心位置

返回值=cv2.magnitude(参数1,参数2)

使用这个函数将数值转换到8位数值形式(图像形式)

d2b705282603655c3f556fe3096a45b0.png

result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))

使用这个将值转换到【0-255】

import numpy as np

import cv2

import matplotlib.pyplot as plt

img = cv2.imread('lena.bmp',0)

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)

dftShift = np.fft.fftshift(dft)

result = 20*np.log(cv2.magnitude(dftShift[:,:,0],dftShift[:,:,1]))

plt.subplot(121),plt.imshow(img, cmap = 'gray')

plt.title('original'),plt.axis('off')

plt.subplot(122),plt.imshow(result, cmap = 'gray')

plt.title('result'), plt.axis('off')

plt.show()

0d47efd0b4310b1ab7e3875649f3f2c0.png

opencv实现逆傅里叶变换

返回结果=cv2.idft(原始数据)

cv2.dft()的逆操作.

返回结果:取决于原始数据的类型和大小。

原始数据:实数或者复数均可。

返回值=cv2.magnitude(参数1,参数2)

d2b705282603655c3f556fe3096a45b0.png

使用这个将值转换到【0-255】即把这个数值转换到8位数值形式

ishift = np.fft.ifftshift(dftShift)

将中间低频部分,移动会原处。numpy.fft.fftshift(dft)的逆操作

import numpy as np

import cv2

import matplotlib.pyplot as plt

img = cv2.imread('lena.bmp',0)

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)

dftShift = np.fft.fftshift(dft)

ishift = np.fft.ifftshift(dftShift)

iImg = cv2.idft(ishift)

iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])

plt.subplot(121),plt.imshow(img, cmap = 'gray')

plt.title('original'), plt.axis('off')

plt.subplot(122),plt.imshow(iImg, cmap = 'gray')

plt.title('inverse'), plt.axis('off')

plt.show()

c598747040aff4533d71239cf1ec2a4d.png

低通滤波opencv实现

前面实现了高通滤波

这里实现低通滤波。用opencv。也可以用numpy,参考前面高通滤波numpy实现.

低频是大量细节,高频是边缘。

低通滤波:相当于把下面右图中心部分白色保留,周围黑色舍弃。

dab28789e2e58f81cb698013a7edb79e.png

实现方法

7e7dc48d13b1ded8089a23bcd168cb24.png

低通滤波器构造

a90a98e47870410b887f338be414d939.png

import numpy as np

import cv2

import matplotlib.pyplot as plt

img = cv2.imread('lena.bmp',0)

#傅里叶变换

dft = cv2.dft(np.float32(img),flags = cv2.DFT_COMPLEX_OUTPUT)#傅里叶变换

dftShift = np.fft.fftshift(dft)#移动低频部分到中心

#低通滤波器构造

rows, cols = img.shape

crow,ccol = int(rows/2) , int(cols/2)

mask = np.zeros((rows,cols,2),np.uint8)

mask[crow-30:crow+30, ccol-30:ccol+30] = 1

#两个通道,与频谱图像匹配

fShift = dftShift*mask

#逆傅里叶变换

ishift = np.fft.ifftshift(fShift)#移动中心位低频到原处

iImg = cv2.idft(ishift)#逆傅里叶变换

iImg= cv2.magnitude(iImg[:,:,0],iImg[:,:,1])#将数值变换到8位二进制数值图像格式

#图像显示

plt.subplot(121),plt.imshow(img, cmap = 'gray')

plt.title('original'), plt.axis('off')

plt.subplot(122),plt.imshow(iImg, cmap = 'gray')

plt.title('result'), plt.axis('off')

plt.show()

099bc96931c4751bc5145970a5b0c762.png

总目录链接:

python3+opencv学习笔记汇总目录(适合基础入门学习)

电气专业的计算机小白,写博文不容易。如果你觉得本文不错。请点个赞支持下。谢谢

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值