首先,如果您不知道,我应该告诉什么是ndwi。 Ndwi代表归一化差异水指数。它是水的图形指示器,值的范围是[-1 1]。 Ndwi的定义如下:

(Green - NIR) / (Green + NIR)

我处于基于opencv的简单海岸线提取工具的中间。我已经在MATLAB中完成它,结果显示如下:

但是,opencv版本的结果看起来像是二值化的:

当我调试程序时,我看到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);

最佳答案

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);

10-07 21:06