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

4

我正在尝试使用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
你能添加原始图像和期望输出图像吗?您可以使用形态学操作来平滑异常部分,然后找到结果轮廓。然后,您可以使用cv2.drawContours()并用白色填充封闭轮廓区域。 - nathancy
请参阅https://docs.opencv.org/3.1.0/d6/d6e/group__imgproc__draw.html#ga746c0625f1781f1ffc9056259103edbc中的cv2.drawContours()函数的thickness参数,其中CV_FILLED表示填充轮廓,-1表示轮廓的厚度。 - fmw42
已编辑 - Bruno Miguel Gonçalves
1个回答

9

以下是一种方法:

  • 将图像转换为灰度图
  • 查找轮廓并填充轮廓
  • 执行形态学变换以去除不需要的部分

我们使用cv2.drawContours()函数查找轮廓并用厚度参数-1来填充轮廓

为了去除线条部分,我们可以使用形态学变换

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)

非常感激。感谢您的答案,nathancy。 - Bruno Miguel Gonçalves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接