2015-03-18 13 views
5

Aşağıdaki kod verildiğinde, python'daki cv2.dilate ve cv2.erode işlevleri, ona gönderdiğim görüntüyü döndürür. Neyi yanlış yapıyorum? OpenCV3.0.0 kullanıyorum. ve numpy1.9.0 ipython 2,7Python-OpenCV genişletme ve aşınma işlevleri hiçbir şeyi değiştirmiyor

im = np.zeros((100,100), dtype=np.uint8) 
im[50:,50:] = 255 
dilated = cv2.dilate(im, (11,11)) 
print np.array_equal(im, dilated) 

üzerinde döner Hangi:

True 

{Düzenlendi} diğer dilate sonrası çekirdek veri türü bir soru temsil eder. Bu gönderi aslında bir işlev çağrısı hatasını yansıtır.

+0

olası yinelenen http://stackoverflow.com/questions/11270937/why- yok-cv2-dilate-aslında-etki-benim-görüntü) –

+0

Benim düşüncem yoktu çekirdeğin dtype'ı, yani uint8'den başka bir şeye varsayılan olabilir. Ancak, yalnızca çekirdeği doğru şekilde belirtmemeniz olabilir; np.ones ((11, 11), dtype = np.uint8) 'ile deneyebilir misiniz? –

cevap

10

İşlev çekirdek çekirdeği değil, çekirdek gerektirir. Yani doğru bir işlev çağrısı aşağıda olacaktır.

dilated = cv2.dilate(im, np.ones((11, 11))) 
+0

* İşlev çağrısında yalnızca bir çekirdek belirtmek, işlevle uyumlu olmayan bir tür iç içe geçme sonucunu verir * - Bunun doğru olduğunu düşündüğüm için yeniden yazmayı düşünürdüm. Girişte bir çekirdek belirtmeniz gerekiyor, ancak OP bunu bir tuple olarak yapmıyor. Söylemeyi düşündüğüm şey, '(11,11)' in bir tuple'sinin yanlış olduğunu ve uygun bir çekirdeğin belirtilmesi gerektiğini (yani np.ones ((11,11)) ') belirtmektir. BTW, 'uint8' bir 'dtype' belirterek bu durumda gereksizdir. Ancak, size +1 verdim çünkü yazdığınız kod sorunun çözülmesinde doğru. – rayryeng

0

Sanırım diziyi değiştirdiğiniz ikinci satırınızla ilgisi var. Muhtemelen veri tipi enfekte olur.

+1

Hayır. Çalışmıyor çünkü OP çekirdeği düzgün şekilde belirtmedi. OP'in bu konudaki cevabına bakınız. – rayryeng

0

fonksiyonu bu şekilde çağrılacak vardır: cv2.dilate (img (giriş), çekirdek, yinelemeleri = numarası (Filtreyi uygulamak istediğiniz kaç kez)

1

belirtmek gerekir uygun bir çekirdek. O, dikdörtgen, dairesel olabilir, vb

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) 
im = np.zeros((100,100), dtype=np.uint8) 
im[50:,50:] = 255 
dilated = cv2.dilate(im, kernel, iterations = 1) 
[Neden cv2 dilate aslında Resmimi etkilemez?] (içinde
İlgili konular