使用 OpenCV 和掩码合并图像

Mic*_*ick 2 python opencv image mask

我一直在使用 OpenCV 和 Python 执行一些图像操作。我设法隔离了我感兴趣的轮廓。现在我有两张图像,一张 NDVI 图像和一张普通图像。我想用我的面具将两者合并。因此,如果我的蒙版的像素位置为零,则应使用图像一的像素;如果蒙版的像素位置为 1,则应使用图像二的像素。基于此,我想合并我的两张照片。

任何建议,将不胜感激 :)!

alk*_*asm 5

numpy通过 mask进行索引非常容易。

有许多不同的方法可以做到这一点。例如,这里有两个浮动图像。然后我创建一个布尔掩码(在这种情况下,我采用随机浮点图像,大约一半的像素将被包括在内,一半被排除在外)。然后对于组合图像,您可以将其设置为等于其中一个图像,然后无论掩码在哪里,True您都可以插入来自另一个图像的值:

>>> import numpy as np
>>> img1 = np.random.rand(100,100,3)
>>> img2 = np.random.rand(100,100,3)
>>> mask = np.random.rand(100,100)>.5
>>> comb_img = img2.copy()
>>> comb_img[mask] = img1[mask]
Run Code Online (Sandbox Code Playgroud)

所以要清楚,在所有的点maskTrue,这个comb_img具有的价值img1,否则有值img2

另一种可能更明确的组合两个图像的方法是首先将组合图像创建为空白图像,然后在掩码点插入一张图像,然后在翻转的掩码点插入另一张图像:

>>> comb_img = np.zeros_like(img1)
>>> comb_img[mask] = img1[mask]
>>> comb_img[~mask] = img2[~mask]
Run Code Online (Sandbox Code Playgroud)

如果你还没有看到它,布尔numpy数组会~反转它:

>>> ~np.array([True, False, True])
array([False,  True, False], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

当然,您的掩码也可以是数字的,您可以只使用mask==0mask>0来创建用于索引的逻辑数组。