2012-06-30 17 views
6

Por lo tanto, estoy generando una imagen binaria (bien, realmente escala de grises, 8 bits, usada como binaria) con python y opencv2, escribiendo una pequeña cantidad de polígonos en la imagen y luego dilatando la imagen usando un kernel. Sin embargo, mi imagen de origen y destino siempre termina igual, sin importar qué núcleo utilizo. ¿Alguna idea?¿Por qué la dilatación del cv2 no afecta mi imagen?

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!!") 

Todo lo que consigo es EPIC FAIL!

Gracias!

Respuesta

8

Entonces, resultó que el problema estaba en la creación tanto del núcleo como de la imagen. Creo que openCV espera 'uint8' como tipo de datos para el kernel y la imagen. En este caso particular, creé el kernel con dtype='int', cuyo valor predeterminado es 'int64'. Además, creé la imagen como 'int8', no 'uint8'. De alguna manera esto no desencadenó una excepción, pero causó que la dilatación fallara de manera sorprendente.

Cambio de las dos líneas anteriores a

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

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

solucionado el problema, y ​​ahora me sale EUREKA! ¡Hurra!

Cuestiones relacionadas