zoukankan      html  css  js  c++  java
  • 高通滤波、低通滤波、带通滤波 python实现

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


    一. 傅里叶变化原理:

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


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

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

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

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


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

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

     1 # Writer : wojianxinygcl@163.com
     2 
     3 # Data  : 2020.3.20
     4 
     5 import cv2
     6 
     7 import numpy as np
     8 
     9 from matplotlib import pyplot as plt
    10 
    11 #读取图像
    12 
    13 img = cv2.imread('../paojie_g.jpg', 0)
    14 
    15 #傅里叶变换
    16 
    17 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
    18 
    19 fshift = np.fft.fftshift(dft)
    20 
    21 #设置高通滤波器
    22 
    23 rows, cols = img.shape
    24 
    25 crow,ccol = int(rows/2), int(cols/2) #中心位置
    26 
    27 mask = np.ones((rows, cols, 2), np.uint8)
    28 
    29 mask[crow-30:crow+30, ccol-30:ccol+30] = 0
    30 
    31 #掩膜图像和频谱图像乘积
    32 
    33 f = fshift * mask
    34 
    35 #傅里叶逆变换
    36 
    37 ishift = np.fft.ifftshift(f)
    38 
    39 iimg = cv2.idft(ishift)
    40 
    41 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
    42 
    43 #显示原始图像和高通滤波处理图像
    44 
    45 plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
    46 
    47 plt.axis('off')
    48 
    49 plt.subplot(122), plt.imshow(res, 'gray'), plt.title('High Pass Filter Image')
    50 
    51 plt.axis('off')
    52 
    53 plt.show()

    四. 高通滤波实验结果:


    高通滤波实验结果 ↑
     

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

     1 # Writer : wojianxinygcl@163.com
     2 
     3 # Data  : 2020.3.20
     4 
     5 import cv2
     6 
     7 import numpy as np
     8 
     9 from matplotlib import pyplot as plt
    10 
    11 #读取图像
    12 
    13 img = cv2.imread('../paojie_g.jpg', 0)
    14 
    15 #傅里叶变换
    16 
    17 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
    18 
    19 fshift = np.fft.fftshift(dft)
    20 
    21 #设置低通滤波器
    22 
    23 rows, cols = img.shape
    24 
    25 crow,ccol = int(rows/2), int(cols/2) #中心位置
    26 
    27 mask = np.zeros((rows, cols, 2), np.uint8)
    28 
    29 mask[crow-30:crow+30, ccol-30:ccol+30] = 1
    30 
    31 #掩膜图像和频谱图像乘积
    32 
    33 f = fshift * mask
    34 
    35 #傅里叶逆变换
    36 
    37 ishift = np.fft.ifftshift(f)
    38 
    39 iimg = cv2.idft(ishift)
    40 
    41 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
    42 
    43 #显示原始图像和低通滤波处理图像
    44 
    45 plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
    46 
    47 plt.axis('off')
    48 
    49 plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Low Pass Filter Image')
    50 
    51 plt.axis('off')
    52 
    53 plt.show()

    六. 低通滤波实验结果:


    低通滤波实验结果 ↑
     

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

     1 # Writer : wojianxinygcl@163.com
     2 
     3 # Data  : 2020.3.20
     4 
     5 import cv2
     6 
     7 import numpy as np
     8 
     9 import math
    10 
    11 from matplotlib import pyplot as plt
    12 
    13 #读取图像
    14 
    15 img = cv2.imread('../paojie_g.jpg', 0)
    16 
    17 #傅里叶变换
    18 
    19 dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
    20 
    21 fshift = np.fft.fftshift(dft)
    22 
    23 #设置带通滤波器
    24 
    25 # w 带宽
    26 
    27 # radius: 带中心到频率平面原点的距离
    28 
    29 rows, cols = img.shape
    30 
    31 crow,ccol = int(rows/2), int(cols/2) #中心位置
    32 
    33 w = 30
    34 
    35 radius = 30
    36 
    37 mask = np.ones((rows, cols, 2), np.uint8)
    38 
    39 for i in range(0, rows):
    40 
    41     for j in range(0, cols):
    42 
    43         # 计算(i, j)到中心点的距离
    44 
    45         d = math.sqrt(pow(i - crow, 2) + pow(j - ccol, 2))
    46 
    47         if radius - w / 2 < d < radius + w / 2:
    48 
    49             mask[i, j, 0] = mask[i, j, 1] = 0
    50 
    51         else:
    52 
    53             mask[i, j, 0] = mask[i, j, 1] = 1
    54 
    55 #掩膜图像和频谱图像乘积
    56 
    57 f = fshift * mask
    58 
    59 #傅里叶逆变换
    60 
    61 ishift = np.fft.ifftshift(f)
    62 
    63 iimg = cv2.idft(ishift)
    64 
    65 res = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
    66 
    67 #显示原始图像和带通滤波处理图像
    68 
    69 plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Image')
    70 
    71 plt.axis('off')
    72 
    73 plt.subplot(122), plt.imshow(res, 'gray'), plt.title('Band Pass Filter Image')
    74 
    75 plt.axis('off')
    76 
    77 plt.show()

    八. 带通滤波实验结果:


    带通滤波实验结果 ↑
     

    九. 总结:

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


    十. 参考内容:

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


    十一. 版权声明:

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

  • 相关阅读:
    【CSS】盒子模型的计算
    【CSS】定义元素的位置
    【Jenkins】安装插件
    安装【Jenkins】
    Python【unittest】模块
    Python【pyyaml】模块
    CentOS下安装gcc和gdb
    汇编学习笔记(15)综合研究
    汇编学习笔记(14)BIOS对键盘输入的处理
    汇编学习笔记(13)直接定址表
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12531004.html
Copyright © 2011-2022 走看看