【问题标题】:Merging each instance mask back to the original image Python将每个实例掩码合并回原始图像 Python
【发布时间】:2020-10-31 00:09:10
【问题描述】:

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

  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

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

面具之一:

合并所有蒙版后:

【问题讨论】:

  • 如果我理解正确,你有一个具有白色(对象)和黑色(背景)值的掩码。您只想显示对象并将图像的其余部分设置为黑色。这是正确的吗?
  • 很接近了。我确实有具有白色(对象)和黑色(背景)值的面具。我有很多面具,每个面具代表原始图片中的一个对象。我想将所有蒙版放在一个与原始图片大小相同的灰度图像中,并且每个对象都必须在其原始位置。
  • 因此,对于每个小蒙版,您都有一个对应的边界框。你想聚合那些小的边界框。您的代码非常接近

标签: python opencv computer-vision cv2


【解决方案1】:

我假设掩码是 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。现在您可以毫无问题地进行所有图像操作。当它是浮动的时候,你可能会遇到很多问题,比如绘图,保存,都会导致一些问题。

【讨论】:

  • 我有点困惑,灰度图像与蒙版相乘不是要求灰度图像和蒙版大小相同吗?我认为您误解了我的问题,我将对主要帖子进行一些编辑以澄清我想要实现的目标
  • 我明白了,你基本上有边界框,而不是整个蒙版。是的,看来我误解了。让我稍微更新一下代码
  • 能否解释一下最后一行,我不太明白?
猜你喜欢
  • 1970-01-01
  • 2019-12-03
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2018-11-22
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多