在MATLAB中合并两张照片,但不包括黑色像素([0 0 0])

时间:2018-12-15 10:26:09

标签: matlab vectorization

我有两个矩阵,我们称它们为photo1和photo2,我想按以下含义合并它们:

只要photo2(i,j,:)[0 0 0]不同,就设置photo1(i,j,:)=photo2(i,j,:)

很显然,我可以使用for循环来编写它。但这太慢了。我正在寻找一种使用MATLAB中向量化思想的解决方案。

我尝试过

[row,column,channel] = find(photo2);
photo1(row,column,channel) = photo2(row,column,channel);

基于MATLAB的文档,但不起作用。它给出了“索引超出矩阵尺寸”。错误,我不知道为什么。我已经用sub2ind和ind2sub摆弄了一段时间,但是我被卡住了。我仍然是MATLAB的初学者。无论如何,我们将不胜感激。

2 个答案:

答案 0 :(得分:3)

问题是[i,j,v] = find(x)的行为不符合您的预期,请检查documentation。此命令仅查找非零条目的2d索引i,j以及这些条目的值v。就像您写[i,j] = find(x(:,:)); v = x(i,j);一样。

要解决此问题,我们首先通过or跨通道确定非黑色条目,然后使用subsub2ind索引转换为线性索引,然后使用这些会覆盖相应的像素。

photo1 = [];
photo1(:,:,1) = [1,1,1;0,0,0;1,1,1];
photo1(:,:,2) = [1,1,1;0,0,0;1,1,1];
photo1(:,:,3) = [1,1,1;0,0,0;1,1,1];

photo2 = [];
photo2(:,:,1) = [2,0,2;2,0,2;2,0,2];
photo2(:,:,2) = [2,0,2;2,0,2;2,0,2];
photo2(:,:,3) = [2,0,2;2,0,2;2,0,2];


[row,column] = find(photo2(:,:,1)|photo2(:,:,2)|photo2(:,:,3));
ind1 = sub2ind(size(photo1), [row;row;row], [column;column;column],[row*0+1;row*0+2;row*0+3]);
ind2 = sub2ind(size(photo2), [row;row;row], [column;column;column],[row*0+1;row*0+2;row*0+3]);

photo1(ind2) = photo2(ind1);

disp(photo1);

Try it online!

答案 1 :(得分:2)

您可以使用以下方法:

方法1:

我们可以将3D矩阵重塑为2D。使用any,我们可以找到不包含0的那些像素。然后使用logical indexing来提取所需的元素。

s = size(photo1);
photo1 = reshape(photo1,[],3);
photo2 = reshape(photo2,[],3);
idx = any(photo2,2);
photo1(idx,:)= photo2(idx,:);
photo1 = reshape(photo1 ,s);

方法2:

我们再次可以使用anyidx是一个掩码。我们将图像乘以蒙版以保留蒙版下的那些值,并将其他像素设置为零。由于implicit expantion,该遮罩将应用于所有三个通道。

idx = any(photo2,3);
photo1 = photo1 .* ~idx + photo2 .* idx;