opencv im2bw 实现
opencv im2bw implementation
我想创建一个类似于 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;
}
我想创建一个类似于 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;
}