一、图像二值化——inRange()
inRange的语法如下
dst = inRange(src, upper, lower)
- src是图像数据
- upper可以是单个数值,也可以是与src相同大小的数组,代表筛选范围最高边界
- lower可以是单个数值,也可以是与src相同大小的数组,代表筛选范围最低边界
- dst既可以写进圆括号内,也可以作为函数的返回值被接收
API运行原理
如果图像中的像素点数值在upper和lower定义的范围之内,就在像素点所在位置返回255;反之不在范围内就返回0。
二、提取特定颜色——inRange()
第一部分讲了inRange()的工作原理,现在我们讲讲它的应用案例——提取图像特定颜色,比如提取出图像中的绿色。
我们需要知道绿色的三个通道各自取值范围,网上有些文章已经总结了每一种颜色的各通道取值区间,举个例子【OpenCV】HSV颜色识别-HSV基本颜色分量范围 - 腾讯云开发者社区。


我们可以发现,基本上在颜色空间HSV中,这样的取值范围才有意义;所以我们还需要用cvtColor()将其他颜色空间转换成HSV颜色空间。
从表中我们可以看出绿色的最小边界是[35, 43, 46],最大边界是[77, 255, 255]。
因此我们可以写成dst = inRange(src, np.array([35, 43, 46]), np.array([77, 255, 255])),来提取图像src中的绿色区域,再执行src[dst==0] = 0后,得到的图像除了绿色区域,其他部分都是黑色。
三、图像阈值处理——threshold()
参考官方API文档:OpenCV: Miscellaneous Image Transformations-Threshold()
图像阈值处理是图像二值化中的一种方法,图像二值化不是说最后得到的像素值是0和1(倘若真的是0和1,颜色是全黑,显然非此)。
直接给出API的语法格式。
cv.threshold(src, thresh, maxval, type[, dst]) ->retval, dst
- src是图像;虽然可以传入多通道彩图(这时候对各个通道单独进行阈值处理),但不建议,灰度图才是最适合阈值处理的。
- thresh是阈值;如果像素值大于阈值就取maxval,否则取0;如果type中设置了自动获取阈值的flag(cv.THRESH_OTSU和cv.THRESH_TRIANGLE),那么thresh一般设置成255,这时不起任何作用。
- maxval是最大填充值;最后得到的图像像素值只有两个,如果type是cv.THRESH_BINARY和cv.THRESH_BINARY_INV时,才会用到maxval,小的填充值是0,而大的填充值是maxval,一般设定成255(灰度图——>白色)。
- type有很多种,用来指定阈值化处理的类型;如果是二值化阈值处理就是cv.THRESH_BINARY和cv.THRESH_BINARY_INV,如果是截断阈值处理就是cv.THRESH_TRUNC,如果是趋零阈值处理就是cv.THRESH_TOZERO和cv.THRESH_TOZERO_INV;此外还可以设置是否自动获取阈值,对应的flag是cv.THRESH_OTSU和cv.THRESH_TRIANGLE,对应两种自动获取阈值的算法;上面提到的最后两种type只能任选一个,同样前面五种type也只能任选一个,一个正确的示例type=cv.THRESH_BINARY | cv.THRESH_OTSU,当然竖杠号也可换成加号。
- retval是返回值,如果非自动获取阈值,最后的retval和设定的thresh相等,而如果是自动获取阈值,返回的是使用自动获取阈值算法得到的阈值。
- dst也即阈值化处理后的图像结果。