2013-09-16 29 views
7

Bu forumda, görüntüler gibi maskelenmiş dizilerin medyanının hesaplanmasıyla ilgili çeşitli tartışmalar gördüm. İstediğim şey biraz daha incelik, görüntüme medyan bir filtre uygulamak. Bunu yapmanın bir yolunu biliyorum, ama çok yavaş ve sürecin hızlandırılmasının yollarını takdir ediyorum. Örneğin, bir maskelenmiş şekil dizisine sahip olduğumu varsayalım (10,10) ve maskelenmiş öğeleri kullanmadan bir kutuyla (3,3) medyan filtresini uygulamak istiyorum. Amacım görüntünün her pikseli içindeki değerin kutunun maskeli medyanının değeriyle değiştirilmesidir. aslında biz bir kaba kuvvet yolda yapabiliriz medyan filtreyi yapmak, ŞimdiMaskeli dizilerin medyan filtresi

im = numpy.random.uniform(size=(10,10)) 
mask = numpy.zeros_like(im) 
mask[1:3,:] = 1 
masked_im = numpy.ma.array(im, mask=mask) 

:

çok basit bir durum varsayarsak, biz "görüntü" ve maskeyi inşa edebilirsiniz

lx, ly = im.shape 
side = 3 
im_filt = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     im_filt[ii,jj] = numpy.ma.median(masked_im[minx:maxx, miny:maxy]) 

Bu, sorunu çözer ve iyi bir sonuç verir, ancak dediğim gibi, ağrılı bir şekilde yavaştır.

im_filt2 = numpy.zeros_like(im) 
for jj in range(ly): 
    for ii in range(lx): 
     minx, maxx = max([ii-side/2,0]), min([ii+side/2+1,lx]) 
     miny, maxy = max([jj-side/2,0]), min([jj+side/2+1,ly]) 
     zoom_im = im[minx:maxx, miny:maxy] 
     zoom_msk = mask[minx:maxx, miny:maxy] 
     im_filt2[ii,jj] = numpy.median(zoom_im[zoom_msk == 0]) 

Bu yüzden tabii ki daha iyidir 0.002'ye 0.018 yürütme zamanı, (getiriyor: hafifçe sürecini hızlandırmak için bir (bana şaşırtıcı) yolu gibi, ayrı ayrı maske ve resim kullanmak mı? ?) Eğer aradığım ~ 50 faktörüne göre değil.

Herhangi bir girdi var mı?

cevap

1

Bu farkın esas olarak MaskedArray nesnesine erişimde (ndarray etrafında bir tür sarıcıdır) üstesinden kaynaklandığı tahmin edilmektedir.

Numpy'de verimli bir medyan filtresi için scikit-image'u da deneyebilirsiniz. Ayrıca bir maske argümanını kabul eder.

+0

Şimdi [skimage.filter.rank] (http://scikit-image.org/docs/dev/api/skimage.filter.rank.html#median) paketinde bulunmaktadır. – letmaik

+0

Yukarıdaki 2 bağlantı artık çalışmıyor gibi görünüyor, şimdi nerede bir fikir? – JoVe

+0

Raporlama için teşekkürler. İşte yeni bir link: http://scikit-image.org/docs/stable/api/skimage.filters.rank.html#median – btel