2

我有两个 geotiff 图像(说“A”和“B”)在 Matlab 中作为矩阵导入Geotiffread。一个有不同的值,而第二个只有 0 和 255s。我想做的是根据它们的位置将所有 255 替换为另一个图像(或矩阵)中的值。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

什么也没有发生。

有没有办法根据特定值和引用空间中的位置将 A 的值替换为 B 的值?

4

3 回答 3

3

正如 darthbith 在他的评论中所说,您需要确保要替换的条目数与您输入的数值相同。

通过这样做A(A==255)=B,您试图将整个矩阵 B 放入等于 255 的 A 的子集中。

但是,如果如您所说,预测是相同的,那么您可以简单地做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显示新矩阵和旧矩阵的位置,这被证明是正确的变化,证明更换确实发生了。

于 2014-01-08T15:01:16.720 回答
2

试试A(A==255) = B(A==255)。该错误告诉您,当您尝试为数组的元素分配值时,您不能给它比您尝试分配的更多或更少的值。

此外,关于 if 语句:if A==255的含义与 相同if all(A==255),如在中,如果有任何元素Aare not 255false则返回。您可以在命令行中进行检查。

如果你真的很绝望,你可以使用一对嵌套for循环来实现这一点(假设AB是相同的大小和形状):

[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
于 2014-01-08T14:59:45.067 回答
2

在我看来,您正在尝试使用二进制掩码来掩盖图像。你可以这样做:

BW = im2bw(B,0.5);
A=A.*BW;

希望能帮助到你

于 2014-01-08T15:24:18.403 回答