如何添加多个二进制掩码?

时间:2019-11-04 05:06:49

标签: python numpy opencv image-processing computer-vision

Conceptual Representation我有一组图像(在不同的焦距下),在这些图像上我找到了二进制蒙版。这些蒙版有些重叠,现在我想将所有这些蒙版加在一起以生成图像的一个大蒙版。有没有一种方法可以将这些蒙版加在一起并仅考虑一次重叠区域。在考虑重叠区域时,应仅考虑边缘最大的区域(来自边缘检测)。

因此,遮罩现在具有所有图像的所有遮罩。现在,我想将这些蒙版添加在一起。任何帮助表示赞赏。

这些是原始图像及其遮罩。 Link to images

因此,如果橙色在重叠区域中具有更多数量的边缘检测点,则应考虑将其视为绿色,而绿色应仅包含不常见的点。橙色和绿色是这里的两个面具。

for file in glob.glob("images/*.jpg")
      img = cv2.imread(file)  
      ret, mask = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)  

2 个答案:

答案 0 :(得分:0)

二进制标记只是具有0或1个值的图像大小的矩阵,当应用蒙版时,发生的一切是将每个值与其蒙版值相乘,如果要删除像素,则蒙版值为0,因此相乘时会得到一个黑色像素,如果不删除该像素,则将保留原始值,因为其乘以1。

要合并遮罩,只需将遮罩添加在一起,任何不应该遮罩的区域将保持为0。

在此简单的操作之后,要做类似的事情

combined_masks[combined_masks > 1] = 1

这将再次将您的蒙版转换为二进制蒙版

因此,基本上可以将其视为维恩图,如果有2个重叠的圆作为您的蒙版,则这些圆的并集将成为组合的蒙版

如下所示,A和B是您的蒙版,灰色区域,它们的“联合”是您组合的蒙版

enter image description here

更新:::如果您只想在这些蒙版中使用公共区域,则仍然可以将这些蒙版加在一起并执行以下操作

combined_masks /= total_num_masks
combined_masks[combined_masks < 1] = 0

更新:::假设您有n个形状为img_w,img_h的蒙版,这就是将它们组合起来的方式。

unified_masks = np.zeros((img_w, img_h))

for mask in list_of_masks:
    unified_masks += mask

unified_masks[unified_masks > 1] = 1

答案 1 :(得分:0)

这是使用Python / OpenCV一起添加多个蒙版的一种方法。

  • 阅读蒙版并转换为浮点数,范围为0到1
  • 使用Python加法添加掩码并乘以255
  • 将生成的蒙版剪切到0到25​​5的范围内,然后转换回int。


import cv2

# read masks
mask1 = cv2.imread('mask1.png').astype("float32")
mask2 = cv2.imread('mask2.png').astype("float32")
mask3 = cv2.imread('mask3.png').astype("float32")
mask4 = cv2.imread('mask4.png').astype("float32")

# add masks
result = 255*(mask1 + mask2 + mask3 + mask4)
result = result.clip(0, 255).astype("uint8")

# show results
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('mask1-4.png', result)

面具:

enter image description here

enter image description here

enter image description here

enter image description here

生成的组合蒙版:

enter image description here

添加:

您也可以这样:

import cv2
import numpy as np

# read masks
mask1 = cv2.imread('mask1.png')
mask2 = cv2.imread('mask2.png')
mask3 = cv2.imread('mask3.png')
mask4 = cv2.imread('mask4.png')

# make list
masks = [mask1, mask2, mask3, mask4]

# add masks
h, w, c = mask1.shape
result = np.full((h,w,c), (0,0,0), dtype=np.uint8)
for mask in masks:
    result = cv2.add(result, mask)

# show results
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('mask1-4.png', result)