阈值的作用是根据设定的值处理图像的灰度值,比如灰度大于某个数值像素点保留。通过阈值以及有关算法可以实现从图像中抓取特定的图形,比如去除背景等。
cv2中的阈值相关函数有:
- 普通阈值函数threshold
- 自适应阈值函数adaptivthreshold
首先介绍简单阈值函数:cv2.threshold(src, thresh, maxval, type[, dst]),返回值为retval, dst
其中:
src是灰度图像
thresh是起始阈值
maxval是最大值
type是定义如何处理数据与阈值的关系。有以下几种:
选项 | 像素值>thresh | 其他情况 |
---|---|---|
cv2.THRESH_BINARY | maxval | 0 |
cv2.THRESH_BINARY_INV | 0 | maxval |
cv2.THRESH_TRUNC | thresh | 当前灰度值 |
cv2.THRESH_TOZERO | 当前灰度值 | 0 |
cv2.THRESH_TOZERO_INV | 0 | 当前灰度值 |
另外的取值为:
- cv2.THRESH_OTSU
- cv2.THRESH_TRIANGLE
- cv2.THRESH_MASK
cv2.THRESH_OTSU使用最小二乘法处理像素点,而cv2.THRESH_TRIANGLE使用三角算法处理像素点。一般情况下,cv2.THRESH_OTSU适合双峰图。cv2.THRESH_TRIANGLE适合单峰图。单峰图或者双峰图指的是灰度直方图。
比如下面的图片的灰度直方图是:
cv2.THRESH_OTSU、cv2.THRESH_TRIANGLE是标志位,他们可以和其他参数,比如cv2.THRESH_BINARY一起使用。
当使用cv2.THRESH_OTSU或cv2.THRESH_TRIANGLE时,阈值是动态的,会根据计算结果返回相应的数值。
以下是固定阈值、使用了OTSU、使用了TRIANGLE的结果:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('d:\\xk.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
min_value=127
#固定阈值
ret,thresh1 = cv2.threshold(gray,min_value,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(gray,min_value,255