2

まず、わからない場合は、ndwi とは何かを教えてください。Ndwi は正規化差分水分指数を表します。これは水のグラフィカル インジケータで、値の範囲は [-1 1] です。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);
4

2 に答える 2

1

greenRoi、nirRoi、ndwi の要素はすべて uchar になります (Mat は CV_8UC1 になります)。

greenRoi = 10、nirRoi = 40 としましょう。

あなたの答えは (10 - 40)/(10+40) = -0.6 ではありません。答えは正でなければならず (符号がないため)、分数であってはなりません。私の電卓によると、これは 0 になります。

@Martin Beckett は正しいです。testImgGreen と testImgNir を float 型の行列に変換すると機能します。必要なもの:

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

Mat greenRoi(testImgGreen, rectangle);
Mat nirRoi(testImgNir, rectangle);
Mat ndwi = (greenRoi - nirRoi) / (greenRoi + nirRoi);
于 2013-05-28T04:42:58.017 に答える