【opencv】cv2.threshold函数解析
0. 介绍
阈值处理是数字图像处理中常用的一种方法,用于将图像转换为二值图像。OpenCV是一个流行的开源计算机视觉库,提供了丰富的图像处理功能,包括阈值处理。
- 阈值处理基本原理是将图像中的每个像素与一个预先设定的阈值进行比较,根据比较结果将像素设置为两个类别之一。通常情况下,如果像素值大于阈值,则设置为一个类别(例如白色),反之则设置为另一个类别(例如黑色)。
在OpenCV中,阈值处理通过函数cv2.threshold()来实现。该函数有多个参数可供调整,其中最重要的是阈值类型和阈值值。常用的阈值类型包括:
- cv2.THRESH_BINARY:大于阈值的像素设置为最大值,小于等于阈值的像素设置为0。
- cv2.THRESH_BINARY_INV:大于阈值的像素设置为0,小于等于阈值的像素设置为最大值。
- cv2.THRESH_TRUNC:大于阈值的像素设置为阈值,小于等于阈值的像素保持不变。
- cv2.THRESH_TOZERO:大于阈值的像素保持不变,小于等于阈值的像素设置为0。
- cv2.THRESH_TOZERO_INV:大于阈值的像素设置为0,小于等于阈值的像素保持不变。
阈值处理在图像处理中有广泛的应用。以下是一些常见的应用场景:
- 图像分割:通过将图像转换为二值图像,可以将图像中的目标物体与背景进行分离。
- 目标检测:将图像转换为二值图像后,可以使用轮廓提取等方法进行目标检测和识别。
- 图像增强:通过设定适当的阈值,可以改善图像的对比度和清晰度。
- 文字识别:将图像转换为二值图像后,可以更容易地提取出文字区域,从而进行文字识别。
- 图像压缩:将图像转换为二值图像可以有效地减小图像文件的大小,实现图像的压缩和存储。
除了上面提到的常见应用外,阈值处理还有许多具体的应用。
- 阈值分割:阈值处理常用于图像分割。在一些特定场景下,由于物体与背景之间的明显颜色差异或灰度差异,可以使用阈值处理将物体与背景进行分离。例如在医学图像中,通过设置合适的阈值将肿瘤分离出来。
- 自适应阈值:在某些情况下,图像中的噪声或光照变化等因素可能会影响阈值效果。此时可以使用自适应阈值方法,即采用不同的阈值对同一图像的不同部分进行处理。OpenCV提供了cv2.adaptiveThreshold()函数实现自适应阈值处理。
- 形态学操作:阈值处理通常与形态学操作(腐蚀、膨胀、开运算、闭运算等)结合使用,以消除边缘锯齿、填补空洞、平滑图像以及分离联通区域等。其中,开运算可用于去除小斑点、消除毛刺和粗糙边缘;闭运算可用于连接分离的物体边缘、填充孔洞和消除白噪声。
- 图像分割:阈值处理可用于实现图像分割,即将图像分离成几个物体或区域。例如在机器人视觉领域中,阈值处理可用于分离机器人周围的环境和障碍物。
- 轮廓提取:阈值处理可用于轮廓提取,即从二值图像中检测出物体的轮廓。OpenCV提供了cv2.findContours()函数实现轮廓检测,该函数可以检测出所有的连通区域,并返回每个区域的相关信息。
- 文字识别:阈值处理可用于文字识别,通过将图像转成二值化图像,进一步分离出文字与背景。例如在OCR领域中,可以使用阈值处理将字母数字与其他部分分离出来,并进行进一步的识别。
总之,阈值处理是数字图像处理中的基础技术之一,通过设定适当的阈值,可以实现图像的二值化,进而应用于各种图像处理任务中。OpenCV提供了方便易用的函数来实现阈值处理,并且被广泛应用于计算机视觉领域。
1. 函数
ret, img = cv2.threshold(img, threshold, maxval, type)
img就是图片,threshold即为阈值,maxval为当灰度值大于(或小于)阈值时将该灰度值赋成的值,type规定的是当前二值化的方式。
其中type最为重要,设置如下:
- cv2.THRESH_BINARY 大于阈值的部分被置为255,小于部分被置为0
- cv2.THRESH_BINARY_INV 大于阈值部分被置为0,小于部分被置为255
- cv2.THRESH_TRUNC 大于阈值部分被置为threshold,小于部分保持原样
- cv2.THRESH_TOZERO 小于阈值部分被置为0,大于部分保持不变
- cv2.THRESH_TOZERO_INV 大于阈值部分被置为0,小于部分保持不变
- cv2.THRESH_OTSU,并且把阈值thresh设为0,算法会找到最优阈值,并作为第一个返回值ret返回。