我用分割方法在苹果上画了一个遮罩。遮罩层有1,其中像素是苹果的一部分,其他地方都是0。如何找到蒙版中的极端像素以找到此蒙版周围的边界框坐标?我使用pytorch和yolact edge来执行分割,如Yolact所示
发布于 2021-07-08 06:38:00
相关的stackoverflow answer有很好的解释。
TL;DR建议的代码片段(第二个更快):
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中找到。
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(mask)
label 是一个输入图像大小的矩阵,其中每个元素都有一个等于其标签的值。
统计是该函数计算的统计矩阵。它的长度等于标签的数量,宽度等于统计信息的数量。它可以与OpenCV文档一起使用:
每个标签的统计信息输出,包括背景标签,可用统计信息见下文。通过statslabel,列访问统计信息,其中可用列在下面定义。
的总面积(以像素为单位
Centroids是一个包含每个质心的x和y位置的矩阵。此矩阵中的行对应于标签编号。
因此,基本上,stats
(前4个值)中的每一项都决定了掩码中每个连接组件(实例)的边界框。
可用于仅返回边界框的可能函数:
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
当然,在一种情况下,这种方法仍然有效。
https://stackoverflow.com/questions/68283785
复制相似问题