【问题标题】:Calculating separated shapes area in a binary mask with opencv使用opencv计算二进制掩码中的分离形状区域
【发布时间】:2021-09-17 08:52:52
【问题描述】:

我正在尝试检测人体面具,但我的算法有时会出错,如下图所示。我在想如果我可以计算图像中的单个形状区域(连接的白色像素),我可以保留最大的一个,我的问题就会得到解决。有办法吗?

【问题讨论】:

  • 使用connectedComponentsWithStats 而不是下面的答案。它会给你the area in pixels,一般来说你应该通过官方文档中的教程来工作。这就是您了解您使用的工具的方式。

标签: python opencv image-processing


【解决方案1】:

您还可以使用 cv2.findContours() 来获取每个白色斑点的轮廓。轮廓带有许多额外的属性,您可以在这里找到:

https://docs.opencv.org/master/d1/d32/tutorial_py_contour_properties.html

这包括获取他们的内部区域。

import cv2
import numpy as np

# load image
img = cv2.imread("outline.png");

# set as binary mask
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
mask = cv2.inRange(gray, 155, 255);

# contours # if you're using OpenCV 3* then it returns as _, contours, _
contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);

# find the biggest contour
biggest = None;
biggest_area = -1;
for con in contours:
    area = cv2.contourArea(con);
    if biggest_area < area:
        biggest_area = area;
        biggest = con;

# draw the new contour
redraw = np.zeros_like(img);
cv2.drawContours(redraw, [biggest], -1, (100, 150, 0), -1);

# show
cv2.imshow("Biggest", redraw);
cv2.waitKey(0);

【讨论】:

    【解决方案2】:

    您可以为此使用 OpenCV 中的 connectedComponents 函数。

    retval, labels=cv.connectedComponents(image[, labels[, connectivity[, ltype]]])
    

    可以在文档中找到有关此功能的更多详细信息。输出图像是一个带标签的图像,其中每个连接的组件都有一个标签。 输出 retval 是标签的总数(也是连接组件的数量)。

    那么你所要做的就是遍历连接的组件以找到具有最多像素的组件。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多