从图像标签创建边界框

3

我有一张2D彩色图片和一个标签图像(标签的投影)

标签图像的输出如下:

[[16 16 16 ... 16 16 16 ]
 [16 16 16 ... 16 16 16 ]
 [16 16 16 ... 16 16 16 ]
 ...
 [ 2  2  2 ...  2  2  2 ]
 [ 2  2  2 ...  2  2  2 ]
 [ 2  2  2 ...  2  2  2 ]]

如何在原始的2D彩色图像中绘制包围所有对象(表示为标签)的边界框?


你正在进行像素级分类吗? - Alex Walczak
是的,这些是实例分割标签。每个像素对应一个标签(例如:1表示椅子,2表示床等)。 - Sid
你是如何显示图片的? - Alex Walczak
使用cv2.imread和cv2.imshow…我想在彩色图像上显示地面真实边界框(我只有地面真实实例分割),使用cv2.rectangle,但我不知道如何计算边界框角坐标。 - Sid
你能计算出每个边界框所属的点吗?如果可以,你就可以从那里获取角落坐标。确定定义边界框的内容是你必须通过查看数据来回答的问题。 - Alex Walczak
我在那个部分遇到了困难,任何帮助将不胜感激。 - Sid
1个回答

4

使用NumPy的布尔数组索引和OpenCV的boundingRect函数可以轻松完成此任务。

这里,我拿到了这张图片

image

还有这个分割掩码

mask

该掩码是一张索引图像,OpenCV对此有问题,详情参见这里。因此,我们还将使用Pillow来完成此任务。

以下是代码:

import cv2
import numpy as np
from PIL import Image

# Read color image
img = cv2.imread('0.jpg')

# Read mask; OpenCV can't handle indexed images, so we need Pillow here
# for that, see also: https://dev59.com/Rrjoa4cB1Zd3GeqPEcUQ
mask = np.array(Image.open('0_mask.png'))

# Iterate all colors in mask
for color in np.unique(mask):

    # Color 0 is assumed to be background or artifacts
    if color == 0:
        continue

    # Determine bounding rectangle w.r.t. all pixels of the mask with
    # the current color
    x, y, w, h = cv2.boundingRect(np.uint8(mask == color))

    # Draw bounding rectangle to color image
    out = cv2.rectangle(img.copy(), (x, y), (x+w, y+h), (0, int(color), 0), 2)

    # Show image with bounding box
    cv2.imshow('img_' + str(color), out)

# Show mask
cv2.imshow('mask', mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是输出结果:

Outputs

由于给定图像的边界框严重重叠,我决定输出多张图片。要将所有矩形绘制到同一张图像上,请用相应的rectangle命令替换即可。

img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, int(color), 0), 2)

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
NumPy:       1.19.2
OpenCV:      4.4.0
Pillow:      7.2.0
----------------------------------------

谢谢,这非常有帮助! - Sid

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