本文共享自华为云社区《[Python图画处理] 二十三.傅里叶改换之高通滤波和低通滤波》,作者:eastmount 。

一.高通滤波

傅里叶改换的目的并不是为了观察图画的频率散布(至少不是终究目的),更多情况下是为了对频率进行过滤,经过修正频率以达到图画增强、图画去噪、边际检测、特征提取、紧缩加密等目的。

过滤的方法一般有三种:低通(Low-pass)、高通(High-pass)、带通(Band-pass)。所谓低通便是保存图画中的低频成分,过滤高频成分,能够把过滤器想象成一张渔网,想要低经过滤器,便是将高频区域的信号悉数拉黑,而低频区域悉数保存。例如,在一幅大草原的图画中,低频对应着广袤且色彩趋于一致的草原,表明图画改换缓慢的灰度重量;高频对应着草原图画中的山君等边际信息,表明图画改换较快的灰度重量,因为灰度尖利过度构成高通滤波器是指经过高频的滤波器,衰减低频而经过高频,常用于增强尖利的细节,但会导致图画的对比度会下降。该滤波器将检测图画的某个区域,依据像素与周围像素的差值来提高像素的亮度。图展现了“Lena”图对应的频谱图画,其中心区域为低频部分。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

接着经过高通滤波器覆盖掉中心低频部分,将255两点改换为0,一起保存高频部分,其处理进程如下图所示。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

rows, cols = img.shape
crow,ccol = int(rows/2), int(cols/2)
fshift[crow-30:crow+30, ccol-30:ccol+30] = 0

经过高通滤波器将提取图画的边际轮廓,生成如下图所示图画。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

# -*- coding: utf-8 -*-
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
#读取图画
img = cv.imread('Lena.png', 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, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(iimg, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()

输出成果如下图所示,榜首幅图为原始“Lena”图,第二幅图为高通滤波器提取的边际轮廓图画。它经过傅里叶改换转换为频谱图画,再将中心的低频部分设置为0,再经过傅里叶逆改换转换为终究输出图画“Result Image”。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

二.低通滤波

低通滤波器是指经过低频的滤波器,衰减高频而经过低频,常用于含糊图画。低通滤波器与高通滤波器相反,当一个像素与周围像素的插值小于一个特定值时,平滑该像素的亮度,常用于去燥和含糊化处理。如PS软件中的高斯含糊,便是常见的含糊滤波器之一,归于削弱高频信号的低通滤波器。

下图展现了“Lena”图对应的频谱图画,其中心区域为低频部分。如果结构低通滤波器,则将频谱图画中心低频部分保存,其他部分替换为黑色0,其处理进程如图所示,终究得到的效果图为含糊图画。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

那么,如何结构该滤波图画呢?如下图所示,滤波图画是经过低通滤波器和频谱图画构成。其中低通滤波器中心区域为白色255,其他区域为黑色0。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

低通滤波器主要经过矩阵设置结构,其核心代码如下:

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

经过低通滤波器将含糊图画的完好代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
#读取图画
img = cv2.imread('lena.bmp', 0)
#傅里叶改换
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
fshift = 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
#掩膜图画和频谱图画乘积
f = fshift * mask
print f.shape, fshift.shape, mask.shape
#傅里叶逆改换
ishift = np.fft.ifftshift(f)
iimg = cv2.idft(ishift)
res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
#显现原始图画和低通滤波处理图画
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Result Image')
plt.axis('off')
plt.show()

输出成果如图所示,榜首幅图为原始“Lena”图,第二幅图为低通滤波器含糊处理后的图画。

跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波

参考文献:

  • 《数字图画处理》(第3版),冈萨雷斯著,阮秋琦译,电子工业出版社,2013年.
  • 《数字图画处理学》(第3版),阮秋琦,电子工业出版社,2008年,北京.
  • OpenCV3编程入门》,毛星云,冷雪飞,电子工业出版社,2015,北京.
  • 百度百科-傅里叶改换
  • 网易云课堂-高登教育 Python+OpenCV图画处理

点击重视,榜首时间了解华为云新鲜技术~