opencv python 基础入门(2): 图像阀值-Image Thresholding

图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像。

阈值分割法的特点是:适用于目标与背景灰度有较强对比的情况,重要的是背景或物体的灰度比较单一,而且总可以得到封闭且连通区域的边界。我们在之前的文章中简单介绍了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

OpenCV Image Thresholding 二进制阈值化表达式

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

4、阈值类型2:反二进制阈值化 cv2.THRESH_BINARY_INV

OpenCV Image Thresholding 反二进制阈值化

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

5、阈值类型3:截断阈值化 cv2.THRESH_TRUNC

OpenCV Image Thresholding 截断阈值化

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

6、阈值类型4:阈值化为0 cv2.THRESH_TOZERO

OpenCV Image Thresholding 阈值化为0

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

7、阈值类型5:反阈值化为0 cv2.THRESH_TOZERO_INV

OpenCV Image Thresholding 反阈值化为0

释义: 原理类似于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)