【问题标题】:circular median filter in pythonpython中的圆形中值滤波器
【发布时间】:2018-01-02 12:42:45
【问题描述】:

我想创建一个具有给定半径的圆形中值滤波器,而不是来自数组的方形滤波器。 到目前为止,这是我的尝试:

#   Apply median filter to each image
import matplotlib.pyplot as plt
radius = 25
disk_filter = plt.fspecial('disk', radius)
w1_median_disk = plt.imfilter(w1data, disk_filter, 'replicate')

w2_median_disk = plt.imfilter(w2data, disk_filter, 'replicate')

w1dataw2data 是我试图应用过滤器的二维 numpy 数组。 fspecial 模块来自 Matlab,但我想在我的 Python 代码中使用它(或等效的东西)。有什么想法吗?

我收到错误消息“

disk_filter = plt.fspecial('磁盘', 半径)
AttributeError: 'module' 对象没有属性 'fspecial'"

我想知道是否有可以导入的包含 fspecial 的模块,或者 Python 中的等效命令。

【问题讨论】:

  • 这段代码有什么问题?
  • 编辑了原始帖子以澄清错误。

标签: python filtering


【解决方案1】:

如果您愿意安装/使用额外的软件包,我强烈推荐惊人的skimage 用于 Python 中的任何类型的图像处理!使用类似盘的过滤器进行过滤只需两行代码:

import skimage
import skimage.data
import skimage.morphology
import skimage.filters

# load example image
original = skimage.data.camera()

# create disk-like filter footprint with given radius
radius = 10
circle = skimage.morphology.disk(radius)

# apply median filter with given footprint = structuring element = selem
filtered = skimage.filters.median(original, selem = circle)

【讨论】:

    【解决方案2】:

    从:
    https://www.mathworks.com/help/images/ref/fspecial.html 抓取“摄影师”图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    import os
    from scipy import misc
    path = 'D:/My Pictures/cameraman.bmp'
    cameraman = misc.imread(path, flatten=0)
    
    cameraman = np.average(cameraman, axis=2)
    
    r = 10
    y,x = np.ogrid[-r: r+1, -r: r+1]
    disk = x**2+y**2 <= r**2
    disk = disk.astype(float)
    
    from scipy import signal
    blur = signal.convolve2d(cameraman, disk, mode='full', boundary='fill', fillvalue=0)
    
    import matplotlib 
    f, (ax1, ax2) = plt.subplots(1, 2, sharey=True)
    ax1.imshow(cameraman, cmap = matplotlib.cm.Greys_r)
    ax1.set_title('cameraman')
    ax2.imshow(blur, cmap = matplotlib.cm.Greys_r)
    ax2.set_title('signal.convolve2d(cameraman, disk..')
    

    或者您可能想使用scipy.ndimage.filters.convolve 进行“反射”边缘处理

    from scipy.ndimage.filters import convolve
    blur = convolve(cameraman, disk)
    

    【讨论】:

      【解决方案3】:

      这是我发现似乎可以完成这项工作的东西:

       from scipy.ndimage.filters import generic_filter as gf
      
       #   Define physical shape of filter mask
       def circular_filter(image_data, radius):
           kernel = np.zeros((2*radius+1, 2*radius+1))
           y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
           mask = x**2 + y**2 <= radius**2
           kernel[mask] = 1                
           filtered_image = gf(image_data, np.median, footprint = kernel)
           return filtered_image
      

      但我不确定我是否完全理解发生了什么。特别是,这些线条到底是做什么的

           y, x = np.ogrid[-radius:radius+1, -radius:radius+1]
           mask = x**2 + y**2 <= radius**2
           kernel[mask] = 1
      

      做吗?

      【讨论】:

        猜你喜欢
        • 2013-02-25
        • 1970-01-01
        • 2012-05-16
        • 2016-09-10
        • 2011-10-02
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 2017-09-06
        相关资源
        最近更新 更多