2017-07-26 17 views
0

私の割り当ては、画像に50x50ピクセルのサイズのメジアンフィルタを適用することです。私はフィルタを適用する方法を知っていますが、それが偶数のときにフィルタのサイズを指定する方法はありますか?これまでの私のコードは以下の通りです。Pythonで偶数サイズのメジアンフィルタを適用する

import matplotlib.pyplot as plt 
from astropy.io import fits 
import scipy.signal as sg 

# Open data files 
hdulist = fits.open('xbulge-w1.fits') 
w1data = hdulist[0].data 

hdulist2 = fits.open('xbulge-w2.fits') 
w2data = hdulist2[0].data 

# Apply median filter to each image 
w1_med = sg.medfilt(w1data) 
w2_med = sg.medfilt(w2data) 

# Set maximum sampled galactic lat (b) and long (l) 
l_max = 15 
b_max = 15 

# Plot median filtered images, rescaled to galactic coordinates 
plt.subplot2grid((2,1), (0,0)) 
plt.imshow(w1_med, origin='lower', 
      extent=[l_max, -l_max, -b_max, b_max], 
      cmap = 'gray') 
plt.title('W1 median filter') 

plt.subplot2grid((2, 1), (1,0)) 
plt.imshow(w2_med, origin='lower', 
      extent=[l_max, -l_max, -b_max, b_max], 
      cmap = 'gray') 
plt.title('W2 median filter') 

plt.tight_layout() 
plt.show() 
+0

答えに対するあなたのコメントに基づいて、カーネルの偶数サイズを強調することが重要だと思います。 –

答えて

0

私はmedfiltため、この定義を参照してください。

Signature: sg.medfilt(volume, kernel_size=None) 
Docstring: 
Perform a median filter on an N-dimensional array. 

Apply a median filter to the input array using a local window-size 
given by `kernel_size`. 

Parameters 
---------- 
volume : array_like 
    An N-dimensional input array. 
kernel_size : array_like, optional 
    A scalar or an N-length list giving the size of the median filter 
    window in each dimension. Elements of `kernel_size` should be odd. 
    If `kernel_size` is a scalar, then this scalar is used as the size in 
    each dimension. Default size is 3 for each dimension. 
    .... 

は、あなたがこれを試したことがありますか? the docsに基づいて

sg.medfilt(w1data,kernel_size=50) 
+0

私はドキュメントでそれを見ましたが、kernel_sizeパラメータは奇数でなければならないことも記載しています。私はkernel_size = 49にPythonのindexing-from-zeroルールを考慮することを躊躇しましたが、デフォルトの3に比べて巨大に見えます。 – Jim421616

0

私はあなたが変更する必要があるすべては

# Apply median filter to each image 
w1_med = sg.medfilt(w1data, kernel_size=50) 
w2_med = sg.medfilt(w2data, kernel_size=50) 

# Apply median filter to each image 
w1_med = sg.medfilt(w1data) 
w2_med = sg.medfilt(w2data) 

だと思う...あなたのためにその仕事をしますか?

0

あなたの質問の鍵はでも、カーネルのサイズはです。 scipy.signal.medfiltは、奇数サイズのカーネルを使用するように制限しています。 Web上で検索を行うと、カーネルが通常は奇妙なサイズの理由に関する多くの情報が得られます。主な理由は、私が信じているのは、センタリングです。

たとえば、偶数サイズのガウスカーネルでガウス分布を含む画像を畳み込むと、ガウス分布が元のサイズに比べて(1/2ピクセル)ずれたガウス分布の画像になります。畳み込まれていない、画像。

具体的には、奇数のカーネルを考慮する別の理由があります。奇数のピクセルを持つと一意の中央値を生成し、偶数のピクセルを持つと、たとえば結果として使用するピクセル:pixel[int(size/2)]pixel[int(size/2)+1]、またはその2つの平均。

偶数番目のカーネルにはscipy.signal.medfiltを使用できません。ただし、入力画像のすべてのピクセルを通過し、各ピクセルの周りに偶数サイズのウィンドウを抽出し、そのウィンドウ内のピクセルの中央値を計算するループを書くことができます。私は "周り"を引用しています。なぜなら、そのウィンドウをどのピクセルに合わせるかは明確ではないからです(それはあなた次第です)。

関連する問題