Home > Enterprise >  Filling the outside of selected Hull Convex with black?
Filling the outside of selected Hull Convex with black?

Time:07-18

I created a convex hull of a hand from an X-ray. I did this by first creating contours along the edges of the hand. I am wanting to blacken the outside region of convex hull using OpenCV in Python. How do I approach this?

The code below creates the convex hull after doing contours:

img_path = 'sample_image.png'

# Getting the threshold of the image:
image = cv2.imread(img_path)
original = image.copy() 
blank = np.zeros(image.shape[:2], dtype = np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 140, 255, cv2.THRESH_BINARY   cv2.THRESH_OTSU)[1]

# Drawing the contours along the edges of the hand in X-ray:
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE)
contours = max(contours, key = lambda x: cv2.contourArea(x))
cv2.drawContours(image, [contours], -1, (255,255,0), 2)

# Drawing the hull along the digits along the edges: 
hull = cv2.convexHull(contours)
cv2.drawContours(image, [hull], -1, (0, 255, 255), 2)

Input image: enter image description here

result

(the line below the dog remains since it's inside the hull created by the dog's feet)

enter image description here

Cropping

To crop the image to only include the hull's area, use cv2.boundingRect and slice the image array:

x, y, w, h = cv2.boundingRect(hull)
cropped = image[y:y   h, x:x   w]
cv2.imwrite(r'dog_crop.jpg', cropped)

Result

enter image description here

  • Related