Reputation: 1297
So, I'm generating a binary (well, really gray scale, 8bit, used as binary) image with python and opencv2, writing a small number of polygons to the image, and then dilating the image using a kernel. However, my source and destination image always end up the same, no matter what kernel I use. Any thoughts?
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!!")
All I get is EPIC FAIL
!
Thanks!
Upvotes: 6
Views: 6506
Reputation: 1297
So, it turns out the problem was in the creation of both the kernel and the image. I believe that openCV expects 'uint8'
as a data type for both the kernel and the image. In this particular case, I created the kernel with dtype='int'
, which defaults to 'int64'
. Additionally, I created the image as 'int8'
, not 'uint8'
. Somehow this did not trigger an exception, but caused the dilation to fail in a surprising fashion.
Changing the above two lines to
binary_image = np.zeros(image.shape,dtype='uint8')
kernel = np.ones((11,11),'uint8')
Fixed the problem, and now I get EUREKA
! Hooray!
Upvotes: 9