Amacım, içinde çok fazla ayrı şekil bulunan çizimleri izlemek ve bu şekilleri ayrı görüntülere ayırmaktır. Beyaz üzerine siyah. Ben Numpy, opencv & eş için oldukça yeni - ama burada benim şimdiki düşünce: siyah pikseller içinNumpy/scipy ile şekil tanıma (belki de havlama)
- tarama
- siyah piksel bulundu -> (çokgen yolu gibi) havza sınırına bulmak havza
- Aramaya devam, ama zaten bulunan sınırların Ben bu tür şeyler çok iyi değilim
içindeki noktaları göz ardı daha iyi bir yolu var mı?
İlk (bu örnekler daha fazla veya daha az bir kolaj) havza sonuçlarının dikdörtgen sınırlayıcı kutu bulmaya çalıştık:
from numpy import *
import numpy as np
from scipy import ndimage
np.set_printoptions(threshold=np.nan)
a = np.zeros((512, 512)).astype(np.uint8) #unsigned integer type needed by watershed
y, x = np.ogrid[0:512, 0:512]
m1 = ((y-200)**2 + (x-100)**2 < 30**2)
m2 = ((y-350)**2 + (x-400)**2 < 20**2)
m3 = ((y-260)**2 + (x-200)**2 < 20**2)
a[m1+m2+m3]=1
markers = np.zeros_like(a).astype(int16)
markers[0, 0] = 1
markers[200, 100] = 2
markers[350, 400] = 3
markers[260, 200] = 4
res = ndimage.watershed_ift(a.astype(uint8), markers)
unique(res)
B = argwhere(res.astype(uint8))
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
tr = a[ystart:ystop, xstart:xstop]
print tr
şekilde
, orijinal dizi kullanımı (a) o zaman argwhere işe yarıyor gibi görünüyor, ama havzadan sonra (res) sadece diziyi tekrar çıktı.
Sonraki adım, şekil etrafında çokgen yolunu bulmak olabilir, ancak sınırlayıcı kutu şu an için harika olurdu!
Lütfen yardım edin!
Yanıtlarınız için ikinize de çok teşekkür ederim, bence bu öyle. Sadece bir tane yeni bir soru: eğer olabilirse: Sınırlayıcı rektlerin alanını kaydedemiyorum, çünkü diğer şekiller 'göz atıyor'. Bu yüzden planım, tersine çevrilmiş etiket dizisi ile görüntü alanını çarpmaktır (böylece mevcut şeklin dışındaki her şey siyah olur) ve ardından görüntü alanını ndimage ile kaydeder. Bunu nasıl yapacağımı doğru yöne yönlendirebilir misin?Biliyorum, vaktim olduğu anda dikkatlice rtfm yapacağım! – user978250
Sadece 'label' (labeled array) içindeki 'number' nesnesinin numarası olan 'label == num' olduğunu istediğinizi düşünüyorum. Bu gibi işlemler numpy dizilerinde vektör edilir, bu yüzden kelimenin tam anlamıyla yukarıdaki ifadedir. "Nesne" nin içinde "Doğru" bir boole dizisi ve "Yanlış" ifadesini alırsınız. –