全局阈值
全局阈值就是在整个图像中将灰度阈值设置成一个常数,全局阈值适合如下场景:图像背景的灰度值在整个图像中可合理的看作恒定,而且所有物体和背景都具有几乎相同的对比度,反应在直方图上就是 具有明显的双峰。在此种情况下,只要选择合适的阈值,使用固定的全局阈值往往会有比较好的效果。全局阈值选择的主要方法有:人工选择法、直方图选择法、迭代式阈值选择法、最大类间方差阈值(Otsu)。
在OpenCV中图像的二值化分割采用的是 cv2.threshold(src, thresh, maxval, type, dst=None)
- 第一个参数src: 原图像
- 第二个参数thresh: 分类的阈值
- 第三个参数 maxval:高于阈值时选取的新的值
- 第四个参数maxval: 就是 上述介绍的几个方法选择参数
常用的有:• cv2.THRESH_BINARY(黑白二值)
• cv2.THRESH_BINARY_INV(黑白二值反转)
• cv2.THRESH_TRUNC (得到的图像为多像素值)
• cv2.THRESH_TOZERO
• cv2.THRESH_TOZERO_INV - 返回值(2个):第一个 retVal: 得到的阈值,第二个 就是阈值化后的图像
import cv2
import numpy as np
img = cv2.imread("sources/lena_1.tiff",0)
from matplotlib import pyplot as plt
ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV )
#ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_OTSU )
cv2.imshow("1",thresh)
cv2.waitKey(0)
自适应阈值
在很多情况下,背景的灰度值并不是常数,物体和背景的对比度在图像中是变化的,此时一个图像中某个区域效果良好的阈值在其他区域可能会效果很差。在这种情况下,需要把灰度阈值取为一个随图像中位置缓慢变化的函数值,也就是自适应阈值。
自适应阈值主要的方法就是将图像进一步划分为子图像,并对不同的子图像使用不同的阈值进行分割。此方法的关键问题就是如何将图像进行细分和如何为得到的子图像估计阈值。
自适应阈值的经典算法是: 分水岭算法,详情参考博文:https://blog.csdn.net/dcrmg/article/details/52498440
OpenCV的自适应阈值函数为:
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
- 第一个参数src: 原图像
- 第二个参数maxVal: 像素的最大值
- 第三个参数 adaptiveMethod(有两种方法):
cv2.ADAPTIVE_THRESH_MEAN_C:邻域内均值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:邻域内像素点加权和,权重为一个高斯窗口
第四个参数thresholdType:有 cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV两个
第五个参数Block Size:规定的邻域大小
第六个参数 C:设置阈值为 (均值 - C) 或者是 (加权值 - C)
返回值: 只有一个,就是二值化后的图像
import cv2
import numpy as np
img = cv2.imread("sources/lena_1.tiff",0)
from matplotlib import pyplot as plt
thresh = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,10)
cv2.imshow("1",thresh)
cv2.waitKey(0)
- 显示效果
------ 全局阈值
-----局部阈值自适应调整
- 分析
最后两个参数,是用来调整子图像大小(子图像边长只能为奇数) 以及 局部子图像阈值自适应调整。这两个参数用来改善二值化的图像的质量。当子图像的大小调整到原图像大小时,该方法退化为 全局阈值调整。