2012-06-30 16 views
6

Quindi, sto generando un'immagine binaria (beh, in realtà a scala di grigi, 8 bit, usata come binario) con python e opencv2, scrivendo un piccolo numero di poligoni sull'immagine e quindi dilatando l'immagine utilizzando un kernel. Tuttavia, la mia immagine di origine e di destinazione finisce sempre nello stesso modo, indipendentemente dal kernel che utilizzo. qualche idea?Perché la dilatazione del cv2 non interessa effettivamente la mia immagine?

from matplotlib import pyplot 
import numpy as np 
import cv2 

binary_image = np.zeros(image.shape,dtype='int8') 
for rect in list_of_rectangles: 
    cv2.fillConvexPoly(binary_image, np.array(rect), 255) 
kernel = np.ones((11,11),'int') 
dilated = cv2.dilate(binary_image,kernel) 
if np.array_equal(dilated, binary_image): 
    print("EPIC FAIL!!") 
else: 
    print("eureka!!") 

Tutto che ottenga è EPIC FAIL!

Grazie!

risposta

8

Quindi, il problema si è verificato nella creazione del kernel e dell'immagine. Credo che openCV si aspetti 'uint8' come un tipo di dati sia per il kernel che per l'immagine. In questo caso specifico, ho creato il kernel con dtype='int', che per impostazione predefinita è 'int64'. Inoltre, ho creato l'immagine come 'int8', non 'uint8'. In qualche modo questo non ha innescato un'eccezione, ma ha causato il fallimento della dilatazione in modo sorprendente.

Modifica queste due linee di

binary_image = np.zeros(image.shape,dtype='uint8') 

kernel = np.ones((11,11),'uint8') 

risolto il problema, e ora ho EUREKA! Evviva!

Problemi correlati