c++ - opencv im2bw 实现

标签 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 的新手,因此问题

最佳答案

它不起作用的原因是您没有正确指定最大阈值(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; 
}

关于c++ - opencv im2bw 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28003497/

相关文章:

c++ - 按值返回时需要左值作为递增操作数

c++ - 无法使用来自不同目录中不同源文件的 Makefile 进行编译

python - glpk.LPX 向后兼容性?

c++ - 如何实现readlink查找路径

c++ - 获取位图中某个点的深度

java - 如何在 java 中加载 DICOM 图像?

html - 如何使用 CSS 为具有透明背景的白色图像着色?

search-path - 当当前目录更改时,Matlab addpath() 不会保留在路径上?

matlab - 缩放 MATLAB/Octave 图,以便正确打印所有标签

c++ - 当我 `throw` 某事时,它存储在内存中的什么位置?