[Matlab]我有两个矩阵,A2和B2。我想浏览两个数组的每个元素,并使用每个数组中的值进行计算,将它们输出到一个新数组中,然后显示结果。
这些数组的值当前采用int格式。我必须将输出数组更改为float数据类型。
实施例: 我想获得元素A2(50,101)并且我想获得元素B2(50,101)然后我想使用该单元格中的值来进行此计算:(B2-A2)/(B2 + A2)。然后将这些结果输出到单元格C2(50,101)。
% Clear Memory
clear;
% Load Landsat Bands
A1 = imread('p074r073_7t20010204_z60_nn30.tif'); % Red - Band 3
B1 = imread('p074r073_7t20010204_z60_nn40.tif'); % IR - Band 4
C1 = imread('p074r073_7t20010204_z60_nn20.tif'); % Green - Band 2
% Subset Fragment
xsize = 600; % Length in x
ysize = 600; % Length in y
A2 = imcrop(A1, [1800 1300 600 600]);
B2 = imcrop(B1, [1800 1300 600 600]);
C2 = imcrop(C1, [1800 1300 600 600]);
% False Color Image
RGBimage = cat(3, B2, A2, C2);
figure(1); imshow(RGBimage,[]); title('False Color Composite Image') % Shows Images
% NDVI Calculations
for a = 1:xsize
RED = A2(a+1,:);
for b = 1:xsize
NIR = B2(b+1,:);
NDVI = (NIR-RED)./(NIR + RED);
end
end
figure(2);imshow(NDVI);
目前这给我这个图像,因为它应该是一个完整的图像:
示例计算
A2:
3 4 5
5 6 7
8 9 1
B2:
1 2 3
4 5 6
7 8 9
A2(2,3)& B2(2,3)
C2(2,3)=(6-7)/(6 + 7)
答案 0 :(得分:1)
要计算NDVI或归一化差值植被指数,您需要已有数据的红色和近红外通道。这些内容存储在A2
和B2
中。您现在想要计算图像中每个像素的NDVI。在这种情况下,您的循环不完全正确。在循环的每次迭代中,您希望一次只访问一个像素,计算NDVI然后将其存储在输出图像中的相同位置。
您没有设置输出图像,所以您应该先处理它。完成后,您必须专门访问输入图像的每个位置,进行NDVI计算,然后将结果存储在输出图像中的相同位置。
因此,首先创建我们称之为NDVI
的输出图像,然后将for
循环修改为这样。请注意,内部循环应为ysize
而不是xsize
:
A2 = double(A2);
B2 = double(B2);
NDVI = zeros(size(A2)); % Allocate image to be the same size as an input image
for a = 1:xsize
for b = 1:ysize
RED = A2(a,b); % Access the red pixel at location (a,b)
NIR = B2(a,b); % Access the near-infrared pixel at location (a,b)
NDVI(a,b) = (NIR-RED)./(NIR + RED); % Compute NDVI and store in the output location (a,b)
end
end
figure; imshow(NDVI, []);
请注意,B2
和A2
可以是整数类型,因此我们强制转换为double
以确保精度在计算之前是浮点数。对于每个位置(a,b)
,访问红色和近红外图像中的正确值,计算NDVI并将其存储在正确的输出位置。您还要谨慎地规范显示,使最低值映射为黑色或0,最高值映射为白色或1.负值将饱和为0,大于1的值将饱和为白色。
然而,MATLAB在矢量化方面非常强大。我的意思是你可以使用一行代码计算NDVI,你可以利用算术运算符处理多个数据点,而不是通过数组中的每个元素循环一个数据点。
因此,您的循环可以替换为:
A2 = double(A2);
B2 = double(B2);
NDVI = (B2 - A2) ./ (B2 + A2);
figure;
imshow(NDVI, []);
正如您所看到的,这与您上面所写的表达相符,这更容易消化并且非常清楚地表达您想要完成的内容。另请注意,在进行计算之前,我们不需要预先分配输出数组。这是即时完成的。