2016-05-05 4 views
-4

Я хочу сделать некоторые вычисления на своих изображениях. Я использую Matlab, но он возвращает неверный ответ. Я не знаю почему.Почему matlab возвращает неверный ответ

Вот мой файл:

function [ newImage ] = Run(file) 

info = geotiffinfo(file); 
[bands,R1]=geotiffread(file); 



imageSize=size(bands); 

result=nan(imageSize(1),imageSize(2),7); 

for i=100:105 

    for j=100:105 

     disp(strcat('Pixel ',sprintf('[%d,%d] of [%d,%d]',imageSize(1),imageSize(2), i,j))); 
     b7=bands(i,i,5); 
     b6=bands(i,i,4); 
     b5=bands(i,i,3); 
     b4=bands(i,i,2); 
     b3=bands(i,i,1); 

     %ndvi 7-4/7+4 
     result(i,j,1)= (b7-b4)/(b7+b4); 
     %NDI45 5-4/5+4 
     result(i,j,2)= (b5-b4)/(b5+b4); 
     %MTCI 6-5/5-4 
     result(i,j,3)= (b6-b5)/(b5-b4); 
     %MCARI [(B5 - B4) - 0.2(B5- B3)] * (B5 - B4) 
     result(i,j,4)= ((b5-b4)-(0.2*(b5-b3)))*(b5-b4); 
     %GNDVI 7-3/7+3 
     result(i,j,4)= (b7-b3)/(b7+b3); 
     %PSSR 7/4 
     result(i,j,5)= (b7)/(b4); 
     %S2REP 705 + 35 *((((B7 + B4)/2) - B5)/(B6 - B5)) 
     result(i,j,6)= 705 + 35 *((((b7 + b4)/2) - b5)/(b6 - b5)); 
     %IRECI 7-4/(5/6) 
     result(i,j,7)=(b7-b4)/(b5/b6); 



    end 
end 


geotiffwrite('D:\SazmanJangalha\ref\result.tif', result, R1, ... 
     'GeoKeyDirectoryTag', info.GeoTIFFTags.GeoKeyDirectoryTag); 
end 

Я просто запустить эти команды и возвращает неправильные ответы:

 result(i,j,7) 

ans = 

    0 

K>> b7-b4 

ans = 

     0 

K>> b7 

b7 = 

    679 

K>> b4 

b4 = 

    1149 

K>> b7-b4 

ans = 

     0 

Похоже, результаты округлены. Зачем?

+0

Какой тип 'band'? – beaker

+0

@beaker is unit16 –

+0

Как вы думаете, что вы думаете, когда вычитаете большее, * unsigned * целое число из меньшего, * неподписанного * целого числа? – excaza

ответ

1

Это происходит потому, что обычно изображения хранятся с использованием UINT8 или UINT16.
Решение состоит в том, чтобы преобразовать данные в double или single.

Поместите следующую строку:

bands = double(bands); 

И он должен работать.

+0

Или целое число со знаком ... Слепо преобразование в тип данных с плавающей точкой, когда ваша программа разработана, при условии, что целые операции - отличный способ открыть себя до нежелательного поведения. – excaza

+0

@excaza, я согласен со всем, что вы написали. И все же то, что я написал, направит OP к пункту «Tricky». – Royi

+0

Он был направлен на «сложную» часть за час до того, как вы отправили свой ответ. – excaza