南汇北京网站建设百度广告联系方式
图像阈值化
图像阈值化简介
⚫ 图像阈值化是图像处理的重要基础部分, 应用很广泛, 可以根据灰度差异来分割图像不同部分
⚫ 阈值化处理的图像一般为单通道图像(灰度图)
⚫ 阈值化参数的设置可以使用滑动条来debug
⚫ 阈值化处理易光照影响, 处理时应注意
⚫ 本节主要介绍的图像阈值化函数方法:
固定阈值:cv2.threshold()
自适应阈值:cv2.adaptiveThreshold()
1)固定阈值—cv2.threshold()
给定阈值进行阈值操作得到二值图(0, 1两类值), 可以过滤灰度值过大或过小的点
函数原型:
⚫ src: 单通道图像(灰度图或二值图)
⚫ dst: 输出图像要求和src一样的尺寸和类型
⚫ thresh: 给定的阈值
⚫ maxval: 第五个参数设置为CV_THRESH_BINARY或
CV_THRESH_BINARY_INV 阈值类型的最大值
第五个参数阈值类型取值如下:
CV2.THRESH BINARY
CV2.THRESH BINARY INV
CV2.THRESH TRUNC
CV2.THRESH TOZERO
CV2.THRESH TOZERO INV
eXI
gray= cv2 .cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold= cv2.threshold(gray,100,255, cv2.THRESH_BINARY)
2)自适应阈值—cv2.adaptiveThreshold()
对矩阵采用自适应阈值操作, 自适应阈值是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.
函数原型:
⚫ src: 单通道图像(灰度图或二值图)
⚫ dst: 输出图像要求和src一样的尺寸和类型
⚫ maxValue:使用cv2.THRESH_BINARY和 cv2.THRESH_BINARY_INV 的最大值
⚫ adaptiveMethod: 指定自适应阈值算法, 可取值为cv2.ADAPTIVE_THRESH_MEAN_C 或 cv2.ADAPTIVE_THRESH_GAUSSIAN_C
⚫ thresholdType: 取阈值类型取值必须为cv2.THRESH_BINARY 、 cv2.THRESH_BINARY_INV二者之一
⚫ blockSize: 用来计算阈值的邻域大小3, 5, 7,…
⚫ C: 减去平均或加权平均后的常数值
函数 adaptiveThreshold 将灰度图像变换到二值图像,采用下面公式:
其中T(x, y)为分别计算每个单独像素的阈值, 取值如下:
对方法 cv2.ADAPTIVE_THRESH_MEAN_C, 先求出块中的均值,再减掉C
对方法 cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 先求出块中的加权和(gaussian), 再减掉C
thres = cv2.adaptiveThreshold(gray,255,CV2.ADAPTIVE_THRESH_MEAN CCV2 .THRESH BINARY,11,2)
thres2 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,CV2 .\cv2.THRESH_BINARY,11,2)
3)Otsu阈值化
在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)
这里用到到的函数还是 cv2.threshold(),但是需要多传入一个参数(flag): cv2.THRESH_OTSU。这时要把阈值设为 0。然后算法会找到最优阈值,这个最优阈值就是返回值 retVal。如果不使用 Otsu 二值化,返回的retVal 值与设定的阈值相等.
img = cv2 .GaussianBlur (img, (5,5), 0)
gray = cv2 .cvtColor(img, cv2.COLOR_BGR2GRAY)
ret3,th3 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH OTSU)