将每个实例掩码合并回原始图像 Python

Merging each instance mask back to the original image Python

我有一堆蒙版(object 是白色的,non-object 是黑色的)以它们的边界框作为单独的图像,我正在尝试将它们放回它们的原始图像上的原始位置。我现在想到的是:

  1. 创建一个与原始图像大小相同的黑色图像。
  2. 将每个掩码的值与原始图像上边界框的坐标值相加。

谁能告诉我我的方向是否正确,还有更好的方法吗?

下面是我的大致实现

import cv2
black_img = np.zeros((height,width)) # A image that is of the size of the original but is all black
mask = cv2.imread("mask.png")
bbox = [x1, y1, x2, y2] # Pretend that this is a valid bounding box coordinate on the original image
black_img[y1:y2, x1:x2] += mask

例如: 我有第一张图片,这是我的面具之一。它的大小与原始图像上的边界框相同。我正在尝试将每个蒙版重新合并在一起,以便获得类似于第二张图片的效果。

面具之一:

合并所有蒙版后:

我假设掩码是 0 和 1,并且您的图像是灰度图像。此外,对于每个 small_mask,您都有对应的 bbox.

mask = np.zeros((height,width))
for small_mask, bbox in zip(masks, bboxes):
    x1, y1, x2, y2 = bbox
    mask[y1:y2, x1:x2] += small_mask
mask = ((mask>=1)*255.0).astype(np.uint8)

现在你把所有的小面具组合在一起了。

最后一行: 我的假设是以某种方式两个面具可能相交。所以这些交叉点的​​值可能大于 1。mask >= 1 告诉我大于 0 的像素将全部打开。

我将其乘以 255.0 因为我想让它变白。您将无法在灰度图像中看到 1。

(mask >= 1)*255.0 将范围从 [0-1] 扩展到 [0-255]。但是这个值是浮点数,不是图片类型。

.astype(np.uint8)float 转换为 uint8。现在您可以毫无问题地进行所有图像操作。当它是浮动的时候,你可能会遇到很多问题,比如绘图,保存,都会导致一些问题。