2017-07-26 101 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. 
    .... 

你試過嗎?

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

我在文檔中看到了這一點,但它也表明kernel_size參數必須是奇數。我確實想知道是否讓kernel_size = 49考慮了Python的從零開始的索引規則,但這與默認值3相比似乎很大。 – Jim421616

0

基於the docs我認爲你需要改變的是

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

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

...爲你做這項工作?

0

你的問題的關鍵是甚至內核的大小。 scipy.signal.medfilt限制您使用奇數大小的內核。在Web上進行搜索,您會發現很多關於內核通常爲奇數大小的信息。我相信主要原因在於集中。例如,如果您將包含具有偶數大小的高斯內核的高斯的圖像進行卷積 - 則最終將得到與原始圖像相比偏移(1/2像素)中心的高斯圖像,沒有捲入,形象。

關於中值濾波器具體而言,還有一個額外的原因可以考慮奇數大小的內核:具有奇數個像素會產生一個唯一的中值,而偶數個像素則需要決定,例如,開使用哪個像素作爲結果:pixel[int(size/2)]pixel[int(size/2)+1]或兩者的平均值。

對於偶數內核,您不能使用scipy.signal.medfilt。但是,您始終可以編寫一個循環遍歷輸入圖像的所有像素,並在每個像素「周圍」提取一個尺寸均勻的窗口,然後計算該窗口中像素的中值。我引用了「around」,因爲不清楚(=獨特)如何將該窗口置於像素上:它將由您來決定。