2017-09-15 99 views
0

[Matlab]我有两个矩阵,A2和B2。我想通过两个数组的每个元素,并使用每个数组中的值进行计算,将它们输出到一个新数组中,然后显示结果。如何迭代2个矩阵并对特定元素进行计算? [Matlab]

这些数组的值目前是int格式。我也必须将输出数组更改为浮点数据类型。我想获得元素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

例Calcs(计算)

A2:


B2:


A2(2,3)& B2(2,3)

C2(2,3)=(6-7)/(6 + 7)

+0

目前还不清楚你在代码中究竟做了什么。请注意,在内循环的每次迭代中,“NDVI”将成为一维矢量,这就是为什么当您显示图像时会看到一条拉长的黑线。你想要做一个像素明智的计算?在这种情况下,你可以避免使用任何循环。我的观点是,你提供的解释和你的代码做的不匹配。具体来说,你在你的问题中引用'A1',但是你的代码中没有定义这样的变量。你能用一个小尺寸的输入来显示一些例子计算吗? – rayryeng

+0

@rayryeng我加了我的代码的其余部分。对于那个很抱歉。我所做的就是将3个图像带读入我的程序(我只使用其中的2个进行计算)。对于那些像素值(0-255),我想要进行NDVI计算。这会给我一个我需要的float数据类型。 – Tristan

回答

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

正如你所看到的,这符合你上面写你的表达,这是更简单消化很清楚要实现什么通信:

因此,你的循环可以被替换。另外请注意,在进行计算之前,我们不需要预先分配输出数组。这是在飞行中完成的。