图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像。
阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。我们在之前的文章中简单介绍了OpenCV的基础知识,此篇进一步介绍OpenCV关于图像阈值的知识点。
1、常用的阈值方法:
- 全局阈值处理 — 本篇重点
- 局部阈值处理
- 自定义处理
2、OpenCV-Python Image Thresholding 图像阈值函数:
Python: cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
参数: img:图像对象,必须是灰度图 thresh:阈值 maxval:最大值 type: cv2.THRESH_BINARY: 小于阈值的像素置为0,大于阈值的置为maxval cv2.THRESH_BINARY_INV: 小于阈值的像素置为maxval,大于阈值的置为0 cv2.THRESH_TRUNC: 小于阈值的像素不变,大于阈值的置为thresh cv2.THRESH_TOZERO 小于阈值的像素置0,大于阈值的不变 cv2.THRESH_TOZERO_INV 小于阈值的不变,大于阈值的像素置0 返回两个值 ret:阈值 img:阈值化处理后的图像 注: INV 表示的是取反
3、阈值类型1:二进制阈值化 cv2.THRESH_BINARY

释义: 在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。
4、阈值类型2:反二进制阈值化 cv2.THRESH_BINARY_INV

释义: 该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。
5、阈值类型3:截断阈值化 cv2.THRESH_TRUNC

释义: 同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。
6、阈值类型4:阈值化为0 cv2.THRESH_TOZERO

释义: 先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。
7、阈值类型5:反阈值化为0 cv2.THRESH_TOZERO_INV

释义: 原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。
8、代码示例
import cv2.cv2 as cv #全局阈值 def OpenCV_threshold(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割。 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) print("threshold value %s".format(ret)) cv.namedWindow("binary0", cv.WINDOW_NORMAL) cv.imshow("binary0", binary)