图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。
大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出。从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大。
前面介绍了OTSU算法,但这算法属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力(这个可以见下图)
这种办法就是自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)
如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值。值得说明的是:如果用局部的均值作为局部的阈值,就是常说的移动平均法。
cv2.threshold(
src:表示的是图片源
thresh:表示的是阈值(起始值)
maxval:表示的是最大值
type:表示的是这里划分的时候使用的是什么类型的算法,常用值为0(cv2.THRESH_BINARY)
THRESH_BINARY 将一个灰色的图片,变成要么是白色要么就是黑色
)
# 超过100 的设置为255
temp = cv2.threshold(img, thresh = 100, maxval = 255, type=cv2.THRESH_BINARY)
# thresh = temp[0]
# pic_deal = temp[1]
temp_dark = cv2.threshold(img_dark, thresh = 100, maxval = 255, type=cv2.THRESH_BINARY)
# cv2.imshow("original", img)
# cv2.imshow("original_dark", img_dark)
# cv2.imshow("THRESH_BINARY", temp[1])
# cv2.imshow("THRESH_BINARY_dark", temp_dark[1])
# cv2.waitKey(0)
fig, axes = plt.subplots(2, 2 , figsize=(15,15))
axes[0, 0].imshow(img)
axes[0, 0].set_title('original')
axes[0, 1].imshow(img_dark)
axes[0, 1].set_title('original_dark')
axes[1, 0].imshow(temp[1])
axes[1, 0].set_title('THRESH_BINARY')
axes[1, 1].imshow(temp_dark[1])
axes[1, 1].set_title('THRESH_BINARY_dark')
plt.show()
自适应的时候需要用灰度图片
img = cv2.imread(pic_fil, cv2.IMREAD_UNCHANGED)
img_dark = cv2.imread(pic_fil_dark, cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_dark = cv2.cvtColor(img_dark, cv2.COLOR_BGR2GRAY)
cv2.adaptiveThreshold(
img 输入图像.
maxValue,
adaptiveMethod
ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
thresholdType = CV_THRESH_BINARY,cv2.THRESH_BINARY_INV
block_size , 小区域的面积 如11就是11*11的小块
C 最终阈值等于小区域计算出的阈值再减去此值
)
temp = cv2.adaptiveThreshold(img, maxValue=255
,adaptiveMethod = cv2.ADAPTIVE_THRESH_GAUSSIAN_C
,thresholdType = cv2.THRESH_BINARY
,block_size = 11
,C = 5
)
temp_dark = cv2.adaptiveThreshold(img_dark, maxValue=255
,adaptiveMethod = cv2.ADAPTIVE_THRESH_GAUSSIAN_C
,thresholdType = cv2.THRESH_BINARY
,block_size = 11
,C = 5
)
fig, axes = plt.subplots(2, 2 , figsize=(15,15))
axes[0, 0].imshow(img, cmap='gray')
axes[0, 0].set_title('original')
axes[0, 1].imshow(img_dark, cmap='gray')
axes[0, 1].set_title('original_dark')
axes[1, 0].imshow(temp, cmap='gray')
axes[1, 0].set_title('GAUSSIAN——THRESH_BINARY')
axes[1, 1].imshow(temp_dark, cmap='gray')
axes[1, 1].set_title('GAUSSIAN——THRESH_BINARY_dark')
plt.show()