首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何找到掩码的xmin,xmax,ymin,ymax

如何找到掩码的xmin,xmax,ymin,ymax
EN

Stack Overflow用户
提问于 2021-07-07 17:54:35
回答 1查看 328关注 0票数 0

我用分割方法在苹果上画了一个遮罩。遮罩层有1,其中像素是苹果的一部分,其他地方都是0。如何找到蒙版中的极端像素以找到此蒙版周围的边界框坐标?我使用pytorch和yolact edge来执行分割,如Yolact所示

EN

回答 1

Stack Overflow用户

发布于 2021-07-08 06:38:00

相关的stackoverflow answer有很好的解释。

TL;DR建议的代码片段(第二个更快):

代码语言:javascript
运行
复制
def bbox1(img):
    a = np.where(img != 0)
    bbox = np.min(a[0]), np.max(a[0]), np.min(a[1]), np.max(a[1])
    return bbox

def bbox2(img):
    rows = np.any(img, axis=1)
    cols = np.any(img, axis=0)
    rmin, rmax = np.where(rows)[0][[0, -1]]
    cmin, cmax = np.where(cols)[0][[0, -1]]

    return rmin, rmax, cmin, cmax

但在更一般的情况下,(例如,如果你在图像上有多个“实例”,每个蒙版都是分开的),可能值得考虑使用OpenCV。特别是cv2.connectedComponentsWithStats

这个函数的一些精彩描述可以在另一个相关的answer中找到。

代码语言:javascript
运行
复制
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(mask)

label 是一个输入图像大小的矩阵,其中每个元素都有一个等于其标签的值。

统计是该函数计算的统计矩阵。它的长度等于标签的数量,宽度等于统计信息的数量。它可以与OpenCV文档一起使用:

每个标签的统计信息输出,包括背景标签,可用统计信息见下文。通过statslabel,列访问统计信息,其中可用列在下面定义。

  • cv2.CC_STAT_LEFT最左边的(x)坐标,它是水平direction.
  • cv2.CC_STAT_TOP中边界框的包含起点最上面的(y)坐标,它是垂直direction.
  • cv2.CC_STAT_WIDTH中边界框的包含起点,边界box
  • cv2.CC_STAT_HEIGHT的水平大小,边界box
  • cv2.的垂直大小CC_STAT_AREA连接的组件

的总面积(以像素为单位

Centroids是一个包含每个质心的x和y位置的矩阵。此矩阵中的行对应于标签编号。

因此,基本上,stats (前4个值)中的每一项都决定了掩码中每个连接组件(实例)的边界框。

可用于仅返回边界框的可能函数:

代码语言:javascript
运行
复制
def get_bounding_boxes(mask, min_size=None):
    num_components, labeled_image, bboxes, centroids = cv2.connectedComponentsWithStats(image)
    # return bboxes in cv2 format [x, y, w, h] without background bbox and component size
    return bboxes[1:, :-1]  
# (x, y, x+w, y+h) are 4 points that you are looking for

当然,在一种情况下,这种方法仍然有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68283785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档