opencv im2bw实现

时间:2015-01-17 19:42:38

标签: c++ image matlab opencv image-processing

我想创建一个像Matlab函数im2bw

这样的函数

这就是我所做的。 据我所知,代码将输出像matlab的结果。你能看出我在这里做错了什么吗?

cv::Mat AutomaticMacbethDetection::im2bw(cv::Mat src, double grayThresh)
{
    cv::Mat dst;
    cv::threshold(src,dst,grayThresh,1,CV_THRESH_BINARY);
    return dst; 
}

图像输出是相同的,我是openCV的新手,因此问题

1 个答案:

答案 0 :(得分:4)

它不起作用的原因是您未正确指定最大阈值(cv::threshold函数的第四个参数)。如果您consult the documentation,则以下列方式调用cv::threshold

cv::threshold(src_gray, dst, threshold_value, max_BINARY_value,threshold_type);

每个输入参数解释如下:

  • src_gray:输入图片
  • dst:目标(输出)图像 - 与输入图像相同的类型
  • threshold_value:与阈值操作相关的阈值
  • max_BINARY_value:二进制阈值操作使用的值(设置所选像素)
  • threshold_type:5个阈值操作之一。它们列在文档中。实际上,可以在此处找到关于每个阈值的详细描述:http://docs.opencv.org/doc/tutorials/imgproc/threshold/threshold.html,但您选择了CV_THRESH_BINARY,它将每个像素设置为超出阈值max_BINARY_value

现在,仔细查看您的max_BINARY_value参数。你将它设置为1.你实际应该将其设置为255.我将假设你的输入是一个8位灰度图像,这就是我们将它设置为255的原因。如果这是不是大小写,然后您需要将其设置为数据类型的最大强度。如果它是16位,那么你需要将其设置为65535,依此类推。

CV_THRESH_BINARY的工作方式是,任何超过阈值的值,您都会将此值设置为max_BINARY_value,您选择为1.因此,当您尝试将其显示时,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; 
}