我有两个矩阵,我们称它们为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的初学者。无论如何,我们将不胜感激。
答案 0 :(得分:3)
问题是[i,j,v] = find(x)
的行为不符合您的预期,请检查documentation。此命令仅查找非零条目的2d索引i,j
以及这些条目的值v
。就像您写[i,j] = find(x(:,:)); v = x(i,j);
一样。
要解决此问题,我们首先通过or
跨通道确定非黑色条目,然后使用sub
将sub2ind
索引转换为线性索引,然后使用这些会覆盖相应的像素。
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);
答案 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:
我们再次可以使用any
。 idx
是一个掩码。我们将图像乘以蒙版以保留蒙版下的那些值,并将其他像素设置为零。由于implicit expantion,该遮罩将应用于所有三个通道。
idx = any(photo2,3);
photo1 = photo1 .* ~idx + photo2 .* idx;