python源码 高通滤波、低通滤波、带通滤波

创作不易,如果此文使您有收获,记得点赞哦!


一. 傅里叶变化原理:

    https://www.cnblogs.com/wojianxin/p/12529809.html


二. 高通滤波、低通滤波、带通滤波:

    高通滤波:高频信息通过,低频信息被阻挡;

    低通滤波:低频信息通过,高频信息被阻挡;

    带通滤波:介于低频和高频之间的一带信息通过,其它信息被阻挡。

python源码 高通滤波、低通滤波、带通滤波_第1张图片

        图解高通、低通、带通滤波器 ↑


三. python实现高通滤波实验:

# Writer : [email protected]

# Data  : 2020.3.20

import cv2

import numpy as np

from matplotlib import pyplot as plt

#读取图像

img = cv2.imread('../paojie_g.jpg', 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.ones((rows, cols, 2), np.uint8)

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

#掩膜图像和频谱图像乘积

f = fshift * mask

#傅里叶逆变换

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('High Pass Filter Image')

plt.axis('off')

plt.show()

四. 高通滤波实验结果:

python源码 高通滤波、低通滤波、带通滤波_第2张图片

        高通滤波实验结果 ↑


五. python实现低通滤波实验:

# Writer : [email protected]

# Data  : 2020.3.20

import cv2

import numpy as np

from matplotlib import pyplot as plt

#读取图像

img = cv2.imread('../paojie_g.jpg', 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

#傅里叶逆变换

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('Low Pass Filter Image')

plt.axis('off')

plt.show()

六. 低通滤波实验结果:

python源码 高通滤波、低通滤波、带通滤波_第3张图片

        低通滤波实验结果 ↑


七. python实现带通滤波实验:

# Writer : [email protected]

# Data  : 2020.3.20

import cv2

import numpy as np

import math

from matplotlib import pyplot as plt

#读取图像

img = cv2.imread('../paojie_g.jpg', 0)

#傅里叶变换

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

fshift = np.fft.fftshift(dft)

#设置带通滤波器

# w 带宽

# radius: 带中心到频率平面原点的距离

rows, cols = img.shape

crow,ccol = int(rows/2), int(cols/2) #中心位置

w = 30

radius = 30

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

for i in range(0, rows):

    for j in range(0, cols):

        # 计算(i, j)到中心点的距离

        d = math.sqrt(pow(i - crow, 2) + pow(j - ccol, 2))

        if radius - w / 2 < d < radius + w / 2:

            mask[i, j, 0] = mask[i, j, 1] = 0

        else:

            mask[i, j, 0] = mask[i, j, 1] = 1

#掩膜图像和频谱图像乘积

f = fshift * mask

#傅里叶逆变换

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('Band Pass Filter Image')

plt.axis('off')

plt.show()

八. 带通滤波实验结果:

python源码 高通滤波、低通滤波、带通滤波_第4张图片

        带通滤波实验结果 ↑


九. 总结:

        高通滤波,通过了高频信息,提取了图像边缘和噪声;低通滤波,通过了低频信息,保留了图像背景和基本内容,图像边缘被阻挡,图像变模糊;带通滤波,阻挡了部分特别高频信息和特别低频信息,相对高通滤波来讲,提取的图像边缘减少,相对低通滤波来讲,保留的图像内容也减少。


十. 参考内容:

        ① https://www.cnblogs.com/wojianxin/p/12531004.html

        ② https://www.jianshu.com/p/28b03ea8592b


十一. 版权声明:

        未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!

你可能感兴趣的:(数字图像处理入门)