根据附图,如何在不受输入图像中黑色影响的情况下获得输出图像?如果我使用imfuse(input, background, 'blend'),
,它会混合输入颜色和背景颜色。 我想知道是否有为此目的而构建的方法或算法。
(注意,输入图像中的背景颜色为浅紫色和深色的瞳孔+黑色)
input, background, output image
答案 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)));
现在,通过使用imfuse(bg, obj, 'blend')
,您可以应用根据Wikipedia
将图像与背景组合以创建部分或完全透明的外观的过程。
这似乎 是你想要的。你可能想要的是取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;
更多解释:
在第一行中,我们使用sum(obj,3)
对每个像素求和R,G和B.通过将像素方式与零进行比较,我们得到一个矩阵mask
,其中包含0
,用于obj
中黑色的每个像素,否则包含1
。 / p>
然后,使用bsxfun(@times, bg, ~mask)
,我们将背景图像bg
的每个通道R,G和B乘以掩码的倒数,即如果像素是黑色则乘以1
在obj
中(即我们想要使用背景),如果我们想要用对象替换该像素,则按0
。结果将是背景图像,obj
不为零时为零,并且obj
为零时,其原始值为零。因此,我们只需添加obj
即可获得我们的结果。