2 boyutlu bir dizi tepe algılama
Bir veteriner Kliniği köpek bir pençe altında basınç ölçüm yardım ediyorum. Veri analizi için Python kullanıyorum ve anatomik içine pençeleri bölmeye çalışıyor alt bölgeler kaldım şimdi.
Zamanla pençe tarafından yüklendi her sensör için maksimum değerleri içeren her pençe 2D bir dizi yaptım. İşte Excel istediğim alanları çizmek için kullanılan bir ayağı, bir örnek''. tespit Bu yerel maxima ile sensör var, bu arada en büyük toplamı yaklaşık 2 ile 2 kutu.
Biraz denemeye çalıştım ve sadece her sütun ve satır (bir yöne bakamaz pençe şekli nedeniyle) en yüksek sıcaklık aramak için karar. Bu '' ayrı ayak parmakları oldukça iyi, ama yeri de komşu sensörler işaretleri. algılamak gibi görünüyor
İstiyorum olanlar hangi Python söylemek için en iyi yolu ne olurdu?
Not: ayrı ayak olmalılar beri kareler olamaz Bu 2x2 örtüşme!
Ayrıca aldığım 2x2 gibi bir rahatlık, daha gelişmiş bir çözüm, hoş geldiniz, ama ben sadece bir insan hareketi bilim adamı, bu yüzden ben de gerçek bir programcı ya da bir matematikçi, bu yüzden lütfen devam 'basit'.
Ä°ÅŸte version that can be loaded with np.loadtxt
Sonuçları
@Çalıştım jextee çözüm (sonuçlar aşağıda). Gördüğünüz gibi, ön pençeleri çok çalışır, ama daha az iyi arka bacaklar için çalışıyor.
Daha spesifik olarak, dördüncü parmağın o küçük tepe kabul edemez. Bu döngü en düşük değere doğru yukarıdan aşağıya, burada dikkate almadan görünüyor aslında açıkçası doğasında vardır.
4 ayak da bulmak mümkün olabilir, böylece herkes oynamak için nasıl biliyor @jextee algoritması istiyorsunuz?
Henüz başka denemeler işlenmiş alamadığım için, başka örnekler verebilirim. Ama veriler daha önce vermiş olduğum her pençe ortalaması vardı. Bu dosya, plaka ile temasa geçtiler. sırada 9 pençeleri maksimal veri içeren bir dizidir.
Bu görüntü, mekansal olarak plaka üzerinde yayıldı ne kadar bağlı olduklarını gösterir.
Güncelleme:
I have set up a blog for anyone interestedve I have setup a SkyDrive with all the raw measurements. herkes için daha fazla veri talep etmek için: daha fazla güç!
Yeni güncelleme:
Yardım sonra sorularıma paw detection ile ilgili aldım ve paw sorting en sonunda, her pençe için parmak algılama kontrol etmeyi başardı! Her şey o kadar iyi çalışmıyor anlaşılan ama pençeleri benim örnekteki gibi) bulunur. Gez tabiki, o yüzden keyfi 2x2 seçtiğiniz için benim hatam.
Burada bir terslik burada güzel bir örnek var: bir çivi ayak ve topuk 'iki kez kabul olur çok geniş! olarak kabul ediliyor
Pençe çok büyük, hayır ile 2x2 bir boyut alarak üst üste, bazı ayak iki kez tespit neden olur. Küçük köpekler genellikle şüphelinin 5 parmak, bulmak için başarısız tersi 2x2 alan çok büyük varlık nedeni olduğunu.
Sonra trying the current solution on all my measurements geldiğim için şaşırtıcı sonuç bu yüzden neredeyse tüm küçük köpekler yaramadı bul, 5. ayak ve yüzde 50'nin üzerinde etkileri için büyük köpekler istiyorsunuz bulmak daha!
Çok net bir şekilde değiştirmem gerekiyor. Kendi tahminim, küçük köpekler için daha küçük bir şey için neighborhood
boyutunu değiştirmek ve daha büyük köpekler için. Ama generate_binary_structure
bana dizinin boyutunu deÄŸiÅŸtirmek izin vermedi.
Bu nedenle, başkalarının ayak bulmak, belki de pençe boyutu ile ayak alan ölçek olması için daha iyi bir önerisi olan umut ediyorum?
CEVAP
Tepe kullanarak tespit ettimyerel maksimum filtre. Burada 4 pençeleri ilk veri kümesi sonuç:
Ben de 9 pençeleri ve it worked as well ikinci veri kümesi koştu.
Bunu nasıl burada
import numpy as np
from scipy.ndimage.filters import maximum_filter
from scipy.ndimage.morphology import generate_binary_structure, binary_erosion
import matplotlib.pyplot as pp
#for some reason I had to reshape. Numpy ignored the shape header.
paws_data = np.loadtxt("paws.txt").reshape(4,11,14)
#getting a list of images
paws = [p.squeeze() for p in np.vsplit(paws_data,4)]
def detect_peaks(image):
"""
Takes an image and detect the peaks usingthe local maximum filter.
Returns a boolean mask of the peaks (i.e. 1 when
the pixel's value is the neighborhood maximum, 0 otherwise)
"""
# define an 8-connected neighborhood
neighborhood = generate_binary_structure(2,2)
#apply the local maximum filter; all pixel of maximal value
#in their neighborhood are set to 1
local_max = maximum_filter(image, footprint=neighborhood)==image
#local_max is a mask that contains the peaks we are
#looking for, but also the background.
#In order to isolate the peaks we must remove the background from the mask.
#we create the mask of the background
background = (image==0)
#a little technicality: we must erode the background in order to
#successfully subtract it form local_max, otherwise a line will
#appear along the background border (artifact of the local maximum filter)
eroded_background = binary_erosion(background, structure=neighborhood, border_value=1)
#we obtain the final mask, containing only peaks,
#by removing the background from the local_max mask
detected_peaks = local_max - eroded_background
return detected_peaks
#applying the detection and plotting results
for i, paw in enumerate(paws):
detected_peaks = detect_peaks(paw)
pp.subplot(4,2,(2*i 1))
pp.imshow(paw)
pp.subplot(4,2,(2*i 2) )
pp.imshow(detected_peaks)
pp.show()
Sonra tüm yapmanız gereken kullanmakscipy.ndimage.ölçümleri.etikettüm farklı nesneleri etiketlemek için maske. Sonra onlarla tek tek oynamak mümkün olacak.
Notbu yöntemi arka plan gürültülü değil, çünkü bu iyi çalışıyor. Eğer öyle olsaydı, arka planda diğer istenmeyen zirveleri bir grup tespit. Bir başka önemli faktör boyutudurbir mahalle. Eğer zirve değişiklikler (kabaca orantılı kalmalıdır) boyutu eğer bunu ayarlamak gerekir.
Nasıl JavaScript iki boyutlu bir dizi ...
Çok boyutlu bir dizi ve C dizi dizisi ...
Nasıl Ruby başka bir dizi için bir diz...
Nasıl python iki boyutlu bir dizi tanı...
Nasıl iki boyutlu bir dizi döndürmek m...