传统的机器视觉通常包括两个步骤:——预处理和物体检测。两者之间的桥梁是图像分割[1]。图像分割通过简化或改变图像的表示使图像更易于分析。
例如,一家食品加工厂购买了一批新的肉鸡,想要直观地检测它们的美味程度。机器对图像进行预处理和优化后,首先必须将图像中的鸡与背景分离,并分别分析感兴趣的区域,才能做出快速准确的判断。
然而,图像分割对于愚蠢的人工智能来说并不容易。聪明的人类一眼就能看出下图中哪些东西可以吃,哪些东西不能吃。但计算机要花很大的力气才能把这些东西分开。
原图
图像分割结果
最简单的图像分割方法是二值化。二值图像中的每个像素只有两个值:纯黑或纯白。
彩色图像、灰度图像和二值图像的比较
由于二值图像数据足够简单,因此许多视觉算法都依赖于二值图像。通过二值图像,可以更好地分析物体的形状和轮廓。二值图像也经常被用作原始图像的遮罩(也称为遮罩、遮罩):它就像一张部分挖空的纸,遮盖了我们不感兴趣的区域。执行二值化的方法有很多种,其中最常用的是使用阈值化(Thresholding)进行二值化。
在计算机视觉中,图像通常用矩阵表示。换句话说,无论你的图片看起来多么美味,对于计算机来说都只不过是一个矩阵。
在这个矩阵中,每个像素都是矩阵中的一个元素。在三通道彩色图像中,该元素是三个数字的元组。
彩色三通道图像
对于单通道灰度图像,该元素是一个数字。这个数字代表此时图像的亮度。数字越大,像素越亮。在常见的八位单通道色彩空间中,0代表全黑,255代表全白。
单通道灰度图像
阈值法是指选择一个数。如果大于它,则视为全白,如果小于它,则视为全黑。就像教室里的电灯开关一样,我们轻轻地推动它,如果它突然超过某个阈值,灯就会亮起来。
根据阈值选择方法的不同,可分为全局阈值和局部阈值。
全局阈值
全局方法
全局阈值是指对整个图像中的每个像素使用相同的阈值。我们可以在Photoshop的Image-Adjustment-Threshold中体验一下这个操作:
Photoshop 中的阈值
可以看出,随着阈值级别从1 移动到255,图像中越来越多的区域变黑。当阈值数在一定范围内时,红米肠的轮廓清晰可辨。
正确的二值化使红米肠的轮廓清晰可辨
在生产线环境中,照明是已知的,并且通常设置固定的数字作为全局阈值。但在户外或机器人比赛中,照明条件往往更加复杂*。
RoboMaster赛场绚丽灯光
*此图有些夸张。 RoboMaster 是一项非常正式的比赛,在比赛过程中绝不会为难大家。
同样是奥利奥冰淇淋。摄像头在白天和晚上看到的图像可能会有所不同,恒定的阈值无法同时适应两种情况。
浅色和深色不同的图片
对于画面比较暗的夜晚,我们需要一个比较低的阈值,比如将阈值设置为50。晚上可以清晰地分离出黑白,但白天就会全白(左);如果我们将阈值设置得比较高,比如172,那么白天可以顺利分割,但是到了晚上就全黑了(右)。我们需要能够适应复杂环境的算法。
左阈值=50,右阈值=172
事实上,稍微分析一下,我们可以发现这张图像的颜色差异相当明显,只有深色和浅色两种颜色。因此,无论是白天还是夜晚,其色彩层次直方图都应该有两个明显的峰值,分别代表暗区和亮区。只是白天色阶直方图会整体向右移动,晚上整体向左移动。
图像的颜色级别直方图
如果选择两个波峰之间的波谷作为阈值,则可以轻松分离这两种类型的像素。然而,图像的直方图往往是不连续的,有很多尖峰和抖动,使得找到准确的极值点非常困难。
日本工程师大津信之找到了该波谷的合适数学表达式,并于1979 年发表[2]。这种二值化方法称为大津法。 Otsu 算法类似于一维Fisher 判别分析的离散化模拟。通过穷举法找到一个阈值数,将这些像素分为两类,使得这两类像素的亮度的类内方差最小。类内方差是指两类像素点方差的加权和,其中权重是指此类像素点的个数占整幅图像像素点个数的比例。
也许你的照片不会只有两个颜色截然不同的块。例如,这款冰淇淋有三个峰。
三色冰淇淋(取冰淇淋份数的直方图)
这时只需稍微扩展大津的算法就可以完成。 Otsu 算法的多级推广成为多Otsu 方法[3]。
本地阈值*
本地方法
*也称为自适应阈值、Adaptive Thresholding
在比赛过程中,聚光灯经常照射在特定区域,造成部分被照亮和部分未被照亮的图像。
部分照亮的图像
对于部分照明图像的全局阈值处理,可能会出现“无论设置什么阈值参数,都无法满足整个图像的要求”的尴尬。例如上图中,直接进行全局阈值处理时,当左上半部分的寿司全部显露出来时,右下半部分仍然是黑色的。
局部照明图像的全局阈值处理
这时候我们就用局部阈值来处理。事实上,人的眼睛也伴随着这一步的操作。我们对物体颜色的判断往往会受到物体周围环境颜色的影响,这就是为什么黑人的牙齿看起来更白的原因。
局部阈值法假设图像在某一区域接收到的光照比较接近。它用滑动窗口扫描图像,并将滑动窗口中心点的亮度与滑动窗口内其他区域(称为邻域区域)的亮度进行比较。如果中心点亮度高于邻域亮度*,则将中心点标记为白色,否则标记为黑色。
局部阈值的滑动窗口
*这里所说的是局部阈值化的基本方法。对于实际使用中常见的其他局部阈值方法,请参考Chow-Kaneko自适应阈值方法[4]。
局部阈值的应用非常广泛,特别是对于黑白文本的处理。许多光学字符识别(OCR) 和QR 码扫描算法都使用局部阈值操作。
例如,下面的二维码就是典型的局部光图像:
扫描二维码即可看到部分发光的二维码
如果该图像使用全局阈值(例如下面的图像使用Otsu 算法进行分割),则无论如何都无法正确分割。
全局方法无法处理局部照明图像
使用局部阈值方法可以很好地分割图像。从图中可以清楚地观察到,局部阈值法对大片洁净区域的细节更加敏感,因此纸上出现了很多我们原本无法注意到的斑点。
二维码分段方法
在实际应用中,我们要根据需要选择不同的二值化方法。没有一种方法是绝对完美的。
例如,在识别敌方机器人时,由于装甲板灯条是自发光物体,受环境光影响较小,为了提高程序效率,我们使用固定数字作为全局阈值:
基地自动反击
在能量器官的识别中,由于能量器官只有黑色和白色两种颜色,我们使用Otsu算法及其多种变体:
大能量机制各区域二值图
空中机器人读取基地区域内的二维码时,采用局部阈值法:
空中机器人识别基地
我今天讲的只是图像分割的冰山一角。作为视觉领域最古老的问题之一,许多新的图像分割算法至今仍在被提出。
除了基于阈值的图像分割方法外,常用的分割方法还有基于边缘(如Yanowitz-Bruckstein自适应阈值法[5])、区域(如区域生长算法[6])等。它们是应用于卫星图像处理、交通控制系统、工业生产监控、医学成像等领域发挥着巨大作用。
脑组织图像分割
审稿人:李茜
上一篇
晶元切割划片机(晶圆划片机价格)
下一篇
树莓派 工业用(树莓派工业化)