zoukankan      html  css  js  c++  java
  • 数字图像处理 第四章部分源代码

    图4.32,有无填充对图像频率域滤波的影响

    源代码

     1 '''
     2 有无填充对高斯低通滤波结果的影响
     3 '''
     4 
     5 import cv2
     6 import numpy as np
     7 import matplotlib.pyplot as plt
     8 import self_def
     9 
    10 img = cv2.imread('Fig0432.tif',0)
    11 
    12 #按照p165的步骤填充
    13 img_fill = self_def.fill(img)
    14 fft = np.fft.fft2(img_fill)
    15 F = np.fft.fftshift(fft)#用这一步取代变换前乘以-1^(x+y)
    16 H = self_def.GLPF(img_fill,20)
    17 G = H*F
    18 G_ifft = np.fft.ifftshift(G)
    19 g_fill = np.fft.ifft2(G_ifft)
    20 g1 = self_def.ifill(g_fill)
    21 g1= np.abs(g1)
    22 #g1 = g1.astype(np.uint8)
    23 
    24 #不填充
    25 fft = np.fft.fft2(img)
    26 F = np.fft.fftshift(fft)
    27 H = self_def.GLPF(img,20)
    28 G = H*F
    29 G_ifft = np.fft.ifftshift(G)
    30 g2= np.fft.ifft2(G_ifft)
    31 g2 = np.abs(g2)
    32 #g1 = g1.astype(np.uint8)
    33 
    34 #显示图像
    35 plt.subplot(121),plt.imshow(g1,cmap='gray')
    36 plt.title('fill'),plt.xticks([]),plt.yticks([])
    37 plt.subplot(122),plt.imshow(g2,cmap='gray')
    38 plt.title('none_fill'),plt.xticks([]),plt.yticks([])
    39 plt.show()
     1 def fill(img):
     2     '''
     3     图像填充函数,右侧下侧填充为0
     4     :param img: 被填充图像
     5     :return: 填充后的图像
     6     '''
     7     import numpy as np
     8     m,n = np.shape(img)
     9     img_fill = np.zeros((2*m,2*n))
    10     img_fill[0:m,0:n] = img
    11     return img_fill
    12 
    13 def ifill(img_fill):
    14     '''
    15     取消图像填充函数,仅保留图像左上侧四分之一
    16     :param img_fill: 原图像
    17     :return: 裁剪过后的图像
    18     '''
    19     import numpy as np
    20     p,q = np.shape(img_fill)
    21     m = int(p/2)
    22     n = int(q/2)
    23     img = np.zeros((m,n))
    24     img = img_fill[0:m,0:n]
    25     return img
    26 
    27 def GLPF(img,D0):
    28     '''
    29     高斯低通滤波器,式(4.8-7)
    30     :param img: 需要滤波的图像,用于确定滤波器大小
    31     :param D0: 滤波半径
    32     :return: 滤波器
    33     '''
    34     import numpy as np
    35     m,n = np.shape(img)
    36     mm = np.arange(m)
    37     nn = np.arange(n)
    38     u, v = np.meshgrid(mm, nn)
    39     H = np.exp(-((u-m/2)**2+(v-n/2)**2)**0.5/(2*D0))
    40 
    41     '''
    42     以下代码为了显示滤波器的三维图像
    43     from mpl_toolkits.mplot3d import Axes3D
    44     from matplotlib import pyplot as plt
    45     from matplotlib import cm
    46     fig = plt.figure()
    47     ax = fig.add_subplot(111, projection='3d')
    48     ax.plot_surface(u, v, H, rstride=4, cstride=4, cmap=cm.YlGnBu_r)
    49     plt.show()'''
    50     return H

     运行结果:

    结论:

    要想的到和空间与相同的结果,需要在频率域进行填充

  • 相关阅读:
    Linux重定向命令
    ls命令
    Linux常用命令_(进程管理)
    Linux常用命令_(文件操作)
    Linux常用命令_(文件查看)
    Linux常用命令_(文件搜索)
    Oracle表空间管理
    如何测试数据库表空间不足场景
    find命令
    各种比例尺标准分幅图经差、纬差表
  • 原文地址:https://www.cnblogs.com/jingxin-gewu/p/13551940.html
Copyright © 2011-2022 走看看