【问题标题】:opencv im2bw implementationopencv im2bw 实现
【发布时间】:2015-03-16 05:04:03
【问题描述】:

我想创建一个类似 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 的新手,因此问题

【问题讨论】:

  • 致任何不熟悉 matlab 的 c++/opencv 开发人员:im2bw 采用单通道图像并对其应用阈值。

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


【解决方案1】:

它不起作用的原因是因为您未正确指定最大阈值(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 的工作方式是任何超过您的阈值的值,您将将此值设置为您已选择为 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; 
}

【讨论】:

  • 感谢您的出色回答,我的问题是,我的矩阵已经划分为 0-1 之间的值,因此结果与预期的一样,我将其与 Matlab 进行了比较,一切正常,甚至二进制相同。现在当我有黑白图像时,我想在上面使用 findContours。我的问题从那里开始。
  • stackoverflow.com/questions/28004133/… 这是我的问题,我会编辑它。
  • 非常方便的小功能。我想我会将它添加到我的 OpenCV 实用程序标头中。 +1
  • @Gilad - 我不知道你已经将你的强度标准化为[0,1],这就是为什么我认为你做错了。如果您在问题中指定了这一点,我会简单地将我的答案替换为“是的,您是对的”!
  • @chappjc - 酷!我还没有过多地涉足 OpenCV 的 C++ 版本,但很高兴知道我做出了贡献:)
猜你喜欢
  • 1970-01-01
  • 2015-03-18
  • 2012-01-31
  • 2019-11-25
  • 2014-04-29
  • 2015-05-27
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多