我在Matlab中导入了两个geotiff图像(说“A”和“B”)作为Geotiffread
的矩阵。一个具有不同的值,而第二个只有0和255。
我想要做的是根据其位置将所有255s替换为另一个图像(或矩阵)内的值。
A和B的大小不同,但它们具有相同的投影。
我试过了:
A (A== 255)= B;
输出是错误:
??? In an assignment A(:) = B, the number of elements in A and B must be the same.
否则,我也尝试了逻辑方法:
if A== 255
A= B;
end
没有任何反应。
有没有办法根据特定值和引用空间中的位置将B的值替换为B的值?
答案 0 :(得分:3)
正如darthbith在评论中提到的那样,您需要确保要替换的条目数与您输入的数字值相同。
通过执行A(A==255)=B
,您试图将整个矩阵B放入A的子集中,等于255.
但是,正如你所说,如果投影是相同的,你可以简单地做A(A==255) = B(A==255)
,假设B比A更大或尺寸相同。
一些示例代码提供概念证明。
A = randi([0,10],10,10);
B = randi([0,4],15,15);
C = A % copy original A matrix for comparison later
A(A==5) = B(A==5); % replace values
C==A % compare original and new
此示例代码创建两个矩阵,A为10x10,B为15x15,并将A中等于5的所有值替换为B中的相应值。通过执行C==A
显示为真新矩阵和旧矩阵变化的地方,确实发生了更换。
答案 1 :(得分:2)
试试A(A==255) = B(A==255)
。该错误告诉您,当您尝试将值分配给数组的元素时,您不能给它提供比您尝试分配的值更多或更少的值。
此外,关于if语句:if A==255
表示与if all(A==255)
相同,如果A
中的任何元素不是255
,false
退回。您可以在命令行中查看此内容。
如果你真的很绝望,你可以使用一对嵌套的for
循环来实现这一点(假设A
和B
的大小和形状相同):
[a,b] = size(A);
for ii = 1:a
for jj = 1:b
if A(ii,jj) == 255
A(ii,jj) = B(ii,jj);
end
end
end
答案 2 :(得分:2)
在我看来,你试图用二进制掩码掩盖图像。你可以这样做:
BW = im2bw(B,0.5);
A=A.*BW;
希望有所帮助