首先,如果您不知道,我应该告诉什么是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);