如何迭代2个矩阵并对特定元素进行计算? [Matlab的]

时间:2017-09-15 18:41:36

标签: arrays image matlab for-loop matrix

[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);

目前这给我这个图像,因为它应该是一个完整的图像:

NDVi Result

示例计算

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)

1 个答案:

答案 0 :(得分:1)

要计算NDVI或归一化差值植被指数,您需要已有数据的红色和近红外通道。这些内容存储在A2B2中。您现在想要计算图像中每个像素的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, []);

请注意,B2A2可以是整数类型,因此我们强制转换为double以确保精度在计算之前是浮点数。对于每个位置(a,b),访问红色和近红外图像中的正确值,计算NDVI并将其存储在正确的输出位置。您还要谨慎地规范显示,使最低值映射为黑色或0,最高值映射为白色或1.负值将饱和为0,大于1的值将饱和为白色。

然而,MATLAB在矢量化方面非常强大。我的意思是你可以使用一行代码计算NDVI,你可以利用算术运算符处理多个数据点,而不是通过数组中的每个元素循环一个数据点。

因此,您的循环可以替换为:

A2 = double(A2);
B2 = double(B2);
NDVI = (B2 - A2) ./ (B2 + A2);
figure;
imshow(NDVI, []);

正如您所看到的,这与您上面所写的表达相符,这更容易消化并且非常清楚地表达您想要完成的内容。另请注意,在进行计算之前,我们不需要预先分配输出数组。这是即时完成的。