我有一组图像(在不同的焦距下),在这些图像上我找到了二进制蒙版。这些蒙版有些重叠,现在我想将所有这些蒙版加在一起以生成图像的一个大蒙版。有没有一种方法可以将这些蒙版加在一起并仅考虑一次重叠区域。在考虑重叠区域时,应仅考虑边缘最大的区域(来自边缘检测)。
因此,遮罩现在具有所有图像的所有遮罩。现在,我想将这些蒙版添加在一起。任何帮助表示赞赏。
这些是原始图像及其遮罩。 Link to images
因此,如果橙色在重叠区域中具有更多数量的边缘检测点,则应考虑将其视为绿色,而绿色应仅包含不常见的点。橙色和绿色是这里的两个面具。
for file in glob.glob("images/*.jpg")
img = cv2.imread(file)
ret, mask = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)
答案 0 :(得分:0)
二进制标记只是具有0或1个值的图像大小的矩阵,当应用蒙版时,发生的一切是将每个值与其蒙版值相乘,如果要删除像素,则蒙版值为0,因此相乘时会得到一个黑色像素,如果不删除该像素,则将保留原始值,因为其乘以1。
要合并遮罩,只需将遮罩添加在一起,任何不应该遮罩的区域将保持为0。
在此简单的操作之后,要做类似的事情
combined_masks[combined_masks > 1] = 1
这将再次将您的蒙版转换为二进制蒙版
因此,基本上可以将其视为维恩图,如果有2个重叠的圆作为您的蒙版,则这些圆的并集将成为组合的蒙版
如下所示,A和B是您的蒙版,灰色区域,它们的“联合”是您组合的蒙版
更新:::如果您只想在这些蒙版中使用公共区域,则仍然可以将这些蒙版加在一起并执行以下操作
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一起添加多个蒙版的一种方法。
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)
面具:
生成的组合蒙版:
添加:
您也可以这样:
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)