它不起作用的原因是因为您未正确指定最大阈值(cv::threshold 函数的第四个参数)。如果你consult the documentation,cv::threshold的调用方式如下:
cv::threshold(src_gray, dst, threshold_value, max_BINARY_value,threshold_type);
每个输入参数解释如下:
现在,仔细查看您的 max_BINARY_value 参数。您将其设置为 1。实际上您应该将其设置为 255。我将假设您的输入是 8 位灰度图像,这就是我们将其设置为 255 的原因。如果这是不是 的情况,那么您需要将其设置为您的数据类型的最大强度。如果是 16 位,则需要将其设置为 65535,依此类推。
CV_THRESH_BINARY 的工作方式是任何超过您的阈值的值,您将将此值设置为您已选择为 1 的max_BINARY_value。因此,当您尝试将其可视化时,1 是如此之小强度,你什么都看不到!因此,您只需将第四个参数更改为 255:
cv::Mat AutomaticMacbethDetection::im2bw(cv::Mat src, double grayThresh)
{
cv::Mat dst;
cv::threshold(src,dst,grayThresh,255,CV_THRESH_BINARY);
return dst;
}
请注意,MATLAB 的 im2bw 函数采用介于 [0-1] 之间的阈值,其中 OpenCV 采用介于 [0,maxValue] 之间的阈值,其中 maxValue 是与该数据类型关联的最大值。如果您要指定 [0-1] 之间的值,最好将函数中的 grayThresh 乘以 255 或 65535,或者首先为您的数据类型设置最大值!如果是这种情况,那么您需要将阈值乘以 cv::threshold 的第三个参数中的最大数据类型。
这样:
cv::Mat AutomaticMacbethDetection::im2bw(cv::Mat src, double grayThresh)
{
cv::Mat dst;
cv::threshold(src,dst,255*grayThresh,255,CV_THRESH_BINARY);
return dst;
}