创作缘由:
上篇文章,我们讲了一个总概,那么现在肯定到了该逐一讨论的时刻啦,今天我们就讲讲早期阶段中,我们做开发或者研究一定会考虑到的东西:阈值分割,一个从软件层面上提升硬件采集能力的方法。Go!(早起阶段不仅仅有阈值分割,其实是还有很多突破点的:就比如边缘检测,这里就允许我用一个点来跟大家一起讨论吧,由于篇幅的限制,可能下期再续论:边缘检测)
本文会将必要的文献等资料整理成压缩包,挂在上面供大家下载。文献资料的名字都会用淡红色给出哦!
-----------------------------------------------------------------------基于深度学习的工业缺陷检测-----------------------------------------------------------------
一、历史发展
-
20世纪50-60年代:阈值分割的基础理论和早期应用开始形成。John Tukey提出了箱线图,这是一种利用统计数据进行数据分割的方法,为后来的图像分割技术奠定了基础。(补充:箱线图其实就是EDA中的一种工具,EDA中还有很多大家比较熟悉的:直方图、热图等等)。这位老爷爷也出了一本同名的书籍哦,有想法的可以看看,大部分都是统计学的知识。
相关文献: Tukey J W. Exploratory data analysis[M]. Reading, MA: Addison-wesley, 1977
-
20世纪70年代:随着计算机图像处理技术的发展,阈值分割技术得到了广泛应用和深入研究。Otsu的方法(1979年)成为一个里程碑,提出了一种基于图像直方图的自动阈值选择方法,被广泛应用于各种图像分割任务中。(大津法的提出)
相关文献:Otsu N. A threshold selection method from gray-level histograms[J]. Automatica, 1975, 11(285-296): 23-27.
-
20世纪80-90年代:自适应阈值分割技术开始发展,研究人员提出了多种改进方法,使得阈值分割技术在处理复杂图像时更加有效。(阈值分割的扩展技术的发展)
相关书籍:Gonzalez R C. Digital image processing[M]. Pearson education india, 2009.
-
21世纪至今:随着计算机硬件和算法的不断进步,阈值分割技术进一步优化。基于深度学习的方法也开始融入图像分割领域,提升了阈值分割的效果和应用范围。(深度学习的加入)
相关资料:由屏幕前的各位来写,写完告诉我,我在这里加。
二、图形分割
图形分割是将图像划分为若干个不相交的子区域的过程,其中每个子区域的像素具有相似的属性(如灰度、颜色、纹理等,这三个也是我们检测中的基础依赖),并且不同子区域的像素在这些属性上有显著差异。该过程可以用数学表达式表示为:
图形分割中有一个大头:阈值分割 是基于像素值将图像划分为不同区域的过程,通常使用一个或多个预设的阈值将图像中的像素分为若干类。对于灰度图像,这一过程可以描述为:
三、阈值分割
1、心得体会
很多人可能会对我文章开始说到的:“阈值分割,一个从软件层面上提升硬件采集能力的方法。”感到疑惑。其实在图形处理中你要得到很好的处理样本,要么就是硬件设备好:能够采集到很多细节,这样你做缺陷检测或者其他就有更多细节可以依赖,其实也会有更多方法使用,要么就是你处理的好:就比如一个图像你采用了适合的阈值分割的话,就可以更好的突出前景和背景,达到有些硬件一样的效果,有利于后期的边缘检测等等,有的也可以更好提高鲁棒性。阈值分割可以在灰度图像中用来处理灰度值,实现划分的效果,也可以再彩色图中应用于每个颜色分割特定颜色,也可以针对某个波段进行处理,对不同波段的信息进行分割。
2、直观理解
直观了解下阈值分割,依照OCR识字为例:
图中①wine比较完整,但是n上面多了点,就有可能是阈值设置过低导致本该属于背景的像素点显示了黑色(255白色 0黑色 两者之间有256个阶梯度),如果在基础上阈值设置高点,那么也可能会导致wine有部分缺失,如同②一样。<①②这部分前景是黑色,背景是白色。③就恰恰相反了>。这也是为啥,有的OCR识别不准确的原因之一,也是为啥值得我们研究的地方。
3、归纳分类
固定阈值分割:又名全局阈值分割,也就是笼统的选择一个阈值作为整个图片的分割标准,将图像中的像素值与该阈值进行比较,低于阈值的像素被归为一类,高于阈值的像素被归为另一类。利用固定的阈值对所有像素进行统一处理,简单高效,适用于图像中前景和背景对比明显的情况。适用于光照均匀、对比度高的图像。容易实现,但对复杂图像效果不好。核心代码如下:
cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
Otsu阈值分割:Otsu方法是一种自适应阈值分割方法,通过最大化类间方差来自动选择最佳阈值。通过遍历所有可能的阈值,找到使类间方差最大的阈值,确保前景和背景的分离效果最佳。适用于单峰和双峰直方图的图像,能够自动选择阈值,效果优于固定阈值分割。核心代码如下:
cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
自适应阈值分割:自适应阈值分割根据图像的局部特性动态调整阈值,以应对光照不均匀的情况。将图像分割成若干小区域,每个区域独立计算阈值,适应局部光照变化。适用于光照不均匀的图像,能有效处理局部对比度不同的问题。核心代码如下:
cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
多阈值分割:多阈值分割使用多个阈值将图像分割成多个类别,适用于多峰直方图的图像。在图像直方图中寻找多个阈值,将图像分割成多个不同类别。适用于包含多种物体或区域的图像,能将图像分割成多个层次。核心代码如下:
# 初步阈值分割
_, th1 = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)
_, th2 = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY)
_, th3 = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)
# 合并阈值结果
multi_thresholded_image = th1 + th2 + th3
颜色阈值分割:颜色阈值分割是对彩色图像进行阈值分割,根据不同颜色通道的阈值进行处理。对每个颜色通道设定不同的阈值,结合多个通道的信息进行分割。适用于彩色图像中不同颜色区域的分割,效果显著。核心代码如下:
# 转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 设定颜色范围
lower_bound = np.array([0, 50, 50])
upper_bound = np.array([10, 255, 255])
# 颜色阈值分割
mask = cv2.inRange(hsv_image, lower_bound, upper_bound)
result = cv2.bitwise_and(image, image, mask=mask)
注:黑细字体为定义,蓝粗字体为核心思想,棕粗字体为作用效果。
四、我为人人,人人喂我