2013-05-28 55 views
2

首先,如果你不知道,我應該告訴什麼是ndwi。 Ndwi代表標準化的差異水指數。它是水的圖形指示器,其值範圍爲[-1 1]。 Ndwi定義如下:在opencv中創建NDWI矩陣

(Green - NIR)/(Green + NIR) 

我是一個基於opencv的簡單海岸線提取工具的中間。我在MATLAB完成它,結果是這個樣子:

MATLAB NDWI

然而,結果OpenCV的版本看起來像二值化:

OPENCV NDWI

當我調試的程序,我發現ndwi矩陣中的最小值爲零,這是錯誤的,因爲它應該是-0.8057。負責NDWI計算(OpenCV的版本)的代碼如下:

Mat ndwi = (greenRoi - nirRoi)/(greenRoi + nirRoi); 
double min; 
double max; 
minMaxIdx(ndwi, &min, &max); 
Mat adjNDWI; 
convertScaleAbs(ndwi, adjNDWI, 255/max); 

什麼是這裏的問題,我如何能實現計算權值NDWI?

注:

greenRoi和nirRoi以這種方式創建:

Rect rectangle = boundingRect(Mat(testCorners)); //vector<Point2f> testCorners(4); 

Mat testImgGreen = imread((LPCSTR)testImgGreenPath, 0); 
Mat testImgNir = imread((LPCSTR)testImgNirPath, 0); 

Mat greenRoi(testImgGreen, rectangle); 
Mat nirRoi(testImgNir, rectangle); 
+0

您能否展示更多代碼,特別是greenRoi&nirRoi Mats的創建。他們有什麼類型? greenRoi&nirRoi中的數值範圍是多少? – Bull

+0

範圍是從0到255.這兩個都是灰度圖像,在這個應用程序中作爲roi沒有什麼特別之處,但我會添加代碼。 – onatm

回答

1

greenRoi,nirRoi和ndwi的元素都是uchar的(Mat將是CV_8UC1)。

比方說greenRoi = 10,nirRoi = 40

你的答案不是(10 - 40)/(10 + 40)= -0.6。答案必須是正面的(因爲它沒有簽名)並且不能是分數。根據我的計算器,這將給0。

@Martin Beckett是正確的,將testImgGreen和testImgNir轉換爲浮點類型的矩陣,它將工作。您需要:

testImgGreen.convertTo(testImgGreen, CV_32F); 
testImgNir.convertTo(testImgNir , CV_32F); 

Mat greenRoi(testImgGreen, rectangle); 
Mat nirRoi(testImgNir, rectangle); 
Mat ndwi = (greenRoi - nirRoi)/(greenRoi + nirRoi); 
+0

謝謝你更清楚的答案。現在,我可以得到正確的最小值,但我如何調整顏色範圍?它看起來比matlab結果更亮。 http://i.imgur.com/R6tBE1R.jpg – onatm

2

你需要明確創建一個浮點CV ::墊

cv::Mat image(cols,rows,CV_32FC1)CV_64FC1如果你需要加倍