2017-09-15 35 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, []); 

正如你所看到的,這符合你上面寫你的表達,這是更簡單消化很清楚要實現什麼通信:

因此,你的循環可以被替換。另外請注意,在進行計算之前,我們不需要預先分配輸出數組。這是在飛行中完成的。