2017-07-27 11 views
0

配列の正方形フィルタではなく、指定された半径を持つ円形メジアンフィルタを作成したいとします。ここ は、これまでのところ私の試みです:Pythonの円形メジアンフィルタ

# 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は私がにフィルタを適用しようとしている2-D numpyの配列です。 fspecialモジュールはMatlabに由来していますが、私はPythonコードでそれを使用したい(または同等のものを使用します)。何か案は?

私はそれがFSPECIAL含まれているインポートすることができ、モジュール、またはPythonで同等のコマンドのいずれかがあります場合、私は思ったんだけど、エラーメッセージ "

disk_filter = plt.fspecial('disk', radius)
AttributeError: 'module' object has no attribute 'fspecial'"

を得る。

+0

このコードの問題点は何ですか? – Julien

+0

エラーを明確にするために元の投稿を編集しました。 – Jim421616

答えて

0

こすり『カメラマン』のイメージをから:
https://www.mathworks.com/help/images/ref/fspecial.html

enter image description here

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) 
0

インストールして喜んでいる場合は/私は強くPythonでの画像処理のあらゆる種類の素晴らしいskimageをお勧めします追加のパッケージを使用!円盤状のフィルタでフィルタリングすると、コードのわずか2行されます。

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) 
0

ここで私はそれが仕事をするように見える見つけ何か:

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 

do?