How to fill closed contour region with white

I'm trying to do a mask in cell image just with the ROI, so I applied the contours with OpenCV around the ROI but I've been struggling to get the region inside the contours. I want to have this region inside white and then discard the contours and the rest outside.

cell = cv.imread(original, 0) # original cell image after matching template
imgray = cv.cvtColor(cell,cv.COLOR_BGR2GRAY) 
ret,thresh_binary = cv.threshold(imgray,127,255,cv.THRESH_BINARY)

the resulting image is:

image 1

And the original is:

image 2

from another image after match template and the already marked cell contours, the image that is read in the code:

image 3

So basically what I need is to have white in that closed contour region and discard all the rest (i.e. black). Could someone give me some help or hint about how do I do this?

Upvotes: 4

Views: 11406

Answers (1)

nathancy
nathancy

Reputation: 46670

Here's an approach:

  • Convert image to grayscale
  • Find contours and fill in the contour
  • Perform morphological transformations to remove unwanted sections

We find contours then fill in the contour with cv2.drawContours() using -1 for the thickness parameter

To remove the line section, we can use morphological transformations

import cv2

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

cnts = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    cv2.drawContours(gray,[c], 0, (255,255,255), -1)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,20))
opening = cv2.morphologyEx(gray, cv2.MORPH_OPEN, kernel, iterations=2)

cv2.imshow('gray', gray)
cv2.imshow('opening', opening)
cv2.imwrite('opening.png', opening)
cv2.waitKey(0)

Upvotes: 9

Related Questions