点击上方蓝字关注我们
threshold函数-参数说明微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识
OpenCV在图像二值化的时候提供了一些很有用的API函数,其实基于指定阈值与全局阈值二值化的API函数为
double cv::threshold( InputArray src,OutputArray dst,double thresh,double maxval,int type)
其官方对各个参数的解释如下
src 输入图像,浮点数或者字节类型
dst 输出图像,跟输入图像类型一致
thresh, 阈值
maxval 最大值
type 二值化方式
当前支持五种二值化方式,分别为:
使用演示
输入原图为:
直接输入阈值二值化,很多人正常的操作是:
# 转为灰度之后
src = cv.imread("D:/images/test.png")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
cv.imshow("manual-thresh-binary", binary)
显示如下:
实际上threshold在直接输入阈值的时候是支持三通道图像的,代码如下:
1src = cv.imread("D:/images/test.png")
2cv.imshow("input", src)
3h, w, c = src.shape
4
5# 手动阈值
6ret, binary = cv.threshold(src, 127, 255, cv.THRESH_BINARY)
7cv.imshow("manual-thresh-binary-RGB", binary)
显示如下:
但是当手动阈值输入,变成自动阈值计算的时候,threshold方法就只支持单通道的图像,换言之,对三通道的图像,threshold不支持自动阈值查找。如果输入图像是三通道的调用下面的代码
1# 自动阈值
2src = cv.imread("D:/images/test.png")
3ret, binary = cv.threshold(src, 127, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4cv.imshow("auto-binary-gray", binary)
就会得到如下错误:
error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::threshold'
修改一下
1src = cv.imread("D:/images/test.png")
2gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
3ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4cv.imshow("auto-binary-gray", binary)
显示结果如下:
另外一个问题,这个也是很多新手调用C++版本threshold的自动阈值计算问过我的问题,就是自动阈值计算出来的阈值是多少,其实就是调用函数的返回double值而已。可见有时候大家不怎么看官方文档。
以上就是threshold函数在调用时候值得注意两个关键点!
推荐阅读
OpenCV加速与优化,让代码执行速度飞起来
对象检测新趋势anchor-free模型之CenterNet
anchor-free对象检测网络CornerNet详解
升级到tensorflow2.0,我整个人都不好了
CPU上跑深度学习模型,FPS也可以达100帧
OpenVINO深度学习推理框架 开发技术系列文章汇总
OpenCV4 | 如何一行代码搞定SSD模型推理与结果解析