Matlab:如何混合或融合两个rgb图像?

时间:2016-11-05 06:44:23

标签: matlab

根据附图,如何在不受输入图像中黑色影响的情况下获得输出图像?如果我使用imfuse(input, background, 'blend'),,它会混合输入颜色和背景颜色。 我想知道是否有为此目的而构建的方法或算法。 (注意,输入图像中的背景颜色为浅紫色和深色的瞳孔+黑色)

                                     input, background, output image 

1 个答案:

答案 0 :(得分:1)

让我们创建两个示例图像,类似于您所显示的图像。请注意,这只是创建两个不那么无聊的图像进行测试的简单方法。

bg = bsxfun(@times,permute([0.9, 0.8, 1.0], [1,3,2]), ones(100,100));
obj = bsxfun(@times,permute([0.3, 0.1, 0.4], [1,3,2]), triu(ones(100,100)));

example images

现在,通过使用imfuse(bg, obj, 'blend'),您可以应用根据Wikipedia

的Alpha混合
  

将图像与背景组合以创建部分或完全透明的外观的过程。

这似乎 是你想要的。你可能想要的是取obj的所有非黑色部分并将它们放在bg 上,而不用任何透明效果。要做到这一点,我们首先要在obj中找到黑色和非黑色部分。其次,我们删除了我们想要对象的背景。最后,我们可以添加obj,因为black = 0。

% Find and save all parts of obj which are not black
mask = sum(obj,3) > 0;

% Remove background from locations where the object will be placed, then add object
result = bsxfun(@times, bg, ~mask) + obj;

result

更多解释:

在第一行中,我们使用sum(obj,3)对每个像素求和R,G和B.通过将像素方式与零进行比较,我们得到一个矩阵mask,其中包含0,用于obj中黑色的每个像素,否则包含1。 / p>

然后,使用bsxfun(@times, bg, ~mask),我们将背景图像bg的每个通道R,G和B乘以掩码的倒数,即如果像素是黑色则乘以1obj中(即我们想要使用背景),如果我们想要用对象替换该像素,则按0。结果将是背景图像,obj不为零时为零,并且obj 为零时,其原始值为零。因此,我们只需添加obj即可获得我们的结果。