如何用白色填充闭合轮廓区域

时间:2019-08-16 00:50:31

标签: python opencv image-processing image-segmentation scikit-image

我试图仅用ROI在细胞图像中做遮罩,因此我用OpenCV在ROI周围应用了轮廓,但是我一直在努力使轮廓位于轮廓内。我想将此区域放在白色内,然后将轮廓移开,其余部分放在外面。

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)

生成的图像为:

image 1

原来是:

image 2

从匹配模板和已经标记的单元轮廓之后的另一幅图像中,该图像在代码中读取:

image 3

因此,基本上我需要在封闭的轮廓区域中使用白色,然后丢弃所有其余部分(即黑色)。 有人可以给我一些帮助或暗示我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

这是一种方法:

  • 将图像转换为灰度
  • 找到轮廓并填写轮廓
  • 执行形态转换以删除不需要的部分

我们找到轮廓,然后使用-1作为厚度参数用cv2.drawContours()填充轮廓

要删除行部分,我们可以使用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)