传统的机器视觉通常包括两个步骤:预处理和物体检测。而沟通二者的桥梁则是图像分割(Image Segmentation[1]。图像分割通过简化或改变图像的表示形式,使得图像更易于分析。

举个例子,食品加工厂新进了一批肉鸡,想通过视觉检测其美味程度。机器在预处理优化完图像之后,要先把图像中的鸡肉和背景分开,并对感兴趣的区域单独进行分析,才能做出快速准确的判断。

食品加工厂的视觉处理

然而,图像分割对愚蠢的AI来说并不容易。聪明的人类一眼就能看出下图中哪些东西能吃、哪些不能吃。但计算机要把这些东西分开却得花费一番功夫。

原图

图像分割结果

最简单的图像分割方法是二值化(Binarization)

图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。

彩色图、灰度图、二值图对比

由于二值图像数据足够简单,许多视觉算法都依赖二值图像。通过二值图像,能更好地分析物体的形状和轮廓。二值图像也常常用作原始图像的掩模(又称遮罩、蒙版,Mask):它就像一张部分镂空的纸,把我们不感兴趣的区域遮掉。进行二值化有多种方式,其中最常用的就是采用阈值法(Thresholding进行二值化。

在计算机视觉里,一般用矩阵来表示图像。也就是说,无论你的图片看上去多么好吃,对计算机来说都不过是个矩阵而已。

在这个矩阵里,每一个像素就是矩阵中的一个元素。在三通道的彩色图像中,这个元素是由三个数字组成的元组。

彩色三通道图像

而对于单通道的灰度图像来说,这个元素就是一个数字。这个数字代表了图像在这个点的亮度,数字越大像素点也就越亮,在常见的八位单通道色彩空间中,0代表全黑,255代表全白。

单通道的灰度图

阈值法是指选取一个数字,大于它就视为全白,小于它就视为全黑。就像教室里的灯管开关,我们轻轻地推动它,如果突然间超过了某个阈值,灯就啪的一声亮了。

根据阈值选取方式的不同,可以分为全局阈值和局部阈值。

1、全局阈值(Global Method)

全局阈值,指的是对整个图像中的每一个像素都选用相同的阈值。我们可以在Photoshop的图像—调整—阈值里体验这一操作:

Photoshop里的阈值

可以看到阈值色阶从1到255的移动过程中,图像变黑的区域越来越多。当阈值数字在某个特定范围内的时候,红米肠的轮廓清晰可辨。

正确的二值化使红米肠轮廓清晰可辨

在生产线环境下,光照是已知的,常常会设定一个固定的数字来作为全局阈值。但是在室外或者机器人比赛中,光照条件往往更加复杂。

同样是奥利奥冰激凌,在白天和晚上,摄像头看到的画面可能不太一样,常数阈值无法同时适应这两种情况。

明暗不同的画面

对于画面比较暗的晚上,我们需要一个比较低的阈值,比如说设定阈值为50,它在晚上能很清楚地把黑白两种颜色分开,但是到了白天就是一片白(左边);如果我们把阈值设置得比较高,比如说172,在白天能顺利分割,但在晚上就是一片黑(右边)。我们需要能够适应复杂环境的算法。

左边阈值=50,右边阈值=172

其实,稍作分析我们可以发现,这张图像中的颜色差异还是比较明显的,只有深浅两种颜色。因此,无论是在白天还是黑夜,它的色阶直方图都应该是两个明显的波峰,分别代表深色和浅色的区域。只是色阶直方图在白天会整体向右偏移,而在夜晚整体向左偏移。

图像的色阶直方图

如果选择两个波峰之间的波谷作为阈值,就能轻松地把这两类像素分开。但是图像的直方图往往是不连续的,有非常多尖峰和抖动,要找到准确的极值点十分困难。

日本工程师大津展之为这个波谷找到了一个合适的数学表达,并于1979年发表[2]。这个二值化方法称为大津算法(Otsu’s method。大津算法类似于一维Fisher判别分析的离散化模拟。通过穷举法找到一个阈值数字,把这些像素切成两类,使得这两类像素的亮度的类内方差最小。类内方差指的是两类像素的方差的加权和,这里权指的是这类像素点数量占整个图像像素点数量的比值。

也许你的画面不会只有两坨差异较大的颜色,比如这款雪糕的就有三个尖峰。

三色雪糕(取雪糕部位的直方图)

这时候,只需对大津算法稍加扩展也可以完成。对大津算法的多级推广成为多大津算法(multi Otsu method[3]。

2、局部阈值(Local Method)

局部阈值(Local Method)又称自适应阈值(Adaptive Thresholding)。

比赛中常常会有聚光灯照在一个特定区域,产生局部受光、局部不受光的画面。

局部受光的图像

对于局部受光的图像进行全局阈值,可能会出现“无论设置什么阈值参数,都无法满足全图要求”的尴尬。比如上面这幅图像,直接进行全局阈值时,左上半边的寿司全都显露出来时,右下半边还是一片黑色。

局部受光图像的全局阈值处理

这个时候我们就要用到局部阈值来处理了。其实,人的眼睛也是自带了这一步操作的。我们判定一个东西颜色深浅,往往会受到物体周边的颜色影响,这也就是为什么黑人的牙齿看上去更白。

局部阈值法假定图像在一定区域内受到的光照比较接近。它用一个滑窗扫描图像,并取滑窗中心点亮度与滑窗内其他区域(称为邻域, neighborhood area的亮度进行比较。如果中心点亮度高于邻域亮度,则将中心点标记为白色,否则标记为黑色。

局部阈值的滑窗

这里提到的是局部阈值的基本方法,对于实际使用中常见的其他局部阈值方法,请参阅Chow-Kaneko自适应阈值法 [4]。

局部阈值的应用非常广泛,特别是对白纸黑字的处理非常有效。光学字符识别(OCR)和二维码扫描的算法中,很多都用了局部阈值操作。

比如下面这张二维码就是一张典型的局部受光图像:

局部受光的二维码

如果对这张图片采用全局阈值(例如下图采用大津算法进行分割),是无论如何都无法正确分割的。

全局方法不能处理局部受光图像

而采用局部阈值方法就能很好地分割图像。从图片里可以明显观察到,局部阈值方法对于一大片干净区域的细节比较敏感,所以纸面上多出了很多我们原本注意不到的斑点。

局部方法分割二维码

实际运用中,我们要根据需求选择不同的二值化方法,没有哪个方法是绝对完美的。

例如,在识别敌方机器人时,由于装甲片灯条是自发光物体,受环境光影响较小,为了提高程序运行效率,我们采用固定数字作为全局阈值:

基地自动反击

在能量机关的识别中,由于能量机关只有黑白两种颜色,我们采用了大津算法及其多种变体:

大能量机关各区域的二值图

而在空中机器人读取基地区二维码的时候又用到了局部阈值方法:

空中机器人识别基地

除了基于阈值的图像分割方法外,常用的分割方法还可以基于边缘(如Yanowitz-Bruckstein自适应阈值方法[5])、区域(如区域生长算法[6])等,它们在卫星图像处理、交通控制系统、工业生产监控、医疗影像等领域发挥着巨大的作用。

脑部组织图像分割

本文所述阈值方法的OpenCV实现,请参见博客:Python+OpenCV图像处理实验

项目效果

参考文献

[1] Spirkovska, L. (1993). A summary of image segmentation techniques.

[2] Nobuyuki Otsu (1979). "A threshold selection method from gray-level histograms". IEEE Trans. Sys., Man., Cyber9 (1):62–66.

[3] Ping-Sung Liao and Tse-Sheng Chen and Pau-Choo Chung (2001). "A Fast Algorithm for Multilevel Thresholding". J. Inf. Sci. Eng17 (5):713–727.

[4] Chow,C.K.; and Kaneko, T.: Boundary Detection of Radiographic Images by a Thresholding Method. Frontiers of Pattern Recognition, S. Watanabe, ed.,Academic Press, New York, 1972, pp. 61-82.

[5] Yanowitz, S. D., & Bruckstein, A. M. (1988, November). A new method for image segmentation. In Pattern Recognition, 1988., 9th International Conference on (pp. 270-275). IEEE.

[6] Richardson H W. Regional growth theory[M]. Macmillan,1973.

一文搞懂图像二值化算法相关推荐

  1. 【智能车】图像二值化算法--大津法OTSU

    图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...

  2. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。

    图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产 ...

  3. C#,图像二值化(18)——全局阈值的模糊集理论算法(Huang Thresholding)与源程序

    1 模糊集理论 模糊集理论,也称为模糊集合论,或简单地称为模糊集,1965年美国学者扎德在数学上创立了一种描述模糊现象的方法-模糊集合论.这种方法把待考察的对象及反映它的模糊概念作为一定的模糊集合,建 ...

  4. 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果

    十三种基于直方图的图像全局二值化算法实现 1. 什么是基于直方图的图像全局二值化算法 2. 灰度平均值 3. 百分比阈值(P-Tile法) 3. 基于双峰的阈值 3.1 基于平均值的阈值 3.2 基于 ...

  5. 二值化算法OTSU源码解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 概述: 本文中小编将会跟大家分享一下OpenCV3.1.0中图像二 ...

  6. otsu阈值分割算法原理_大津二值化算法OTSU的理解

    otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...

  7. matlab确定灰度阈值T,matlab灰度图像二值化【灰度图像二值化算法研究】

    摘要: 在很多图像处理的过程中,经常需要对灰度图像进行二值化.本文对几种常用的图像二值化算法进行了阐述,并通过仿真,进行比较研究.根据实验结果,阐明了各种算法的优缺点. Abstract: The b ...

  8. 论文推荐|【KSII TIIS 2021】DP-LinkNet:一种用于古籍文档图像二值化的卷积网络(有源码)...

    今日分享来自[KSII TIIS 2021]的论文『DP-LinkNet: A convolutional network for historical document image binariza ...

  9. 使用深度学习解决拍照文档复杂背景二值化问题

    前言 1.在手持拍照设备对文档进行拍照时,很容易出现光线不均.阴影.过暗等,或者有些旧的文档,古籍文档都有虫洞.透背.字迹不清现象,为了方便阅读.打印文档,或者OCR识别,这些干扰都对处理结果有很多不 ...

最新文章

  1. 编程之美-俄罗斯方块游戏方法整理
  2. VTK:Qt之RenderWindowNoUiFile
  3. POJ 1904 King's Quest(强连通分量)
  4. [大数据可视化]-saiku的源码包Bulid常见问题和jar包
  5. android横竖屏切换布局闪退,Android-Activity横竖屏切换不杀死Activity 并监听横竖屏切换...
  6. destoon网站mysql分表_destoon : 常用数据库操作
  7. django 清理缓存,解决manage.py没有clear_cache命令
  8. 【激光雷达】激光雷达点云数据的技术流程和点云预处理的方法
  9. 触宝电话推“免费拨打国际长途”新业务
  10. 12306 验证码验证流程
  11. Zookeeper之Leader选举
  12. GAN——生成对抗网络详解
  13. 批处理 bat cmd 命令大全
  14. bugku never give up
  15. Android面试资料整理
  16. 搭建企业内外网可快速稳定访问的共享文件服务器方案
  17. 32位/64位操作系统的最大支持内存的空间
  18. 非线性控制1.2——LaSalle不变集原理
  19. 金融風暴下,“杨白劳”与“黄世仁”的年关心态
  20. 2019,2021非科班生的Android面试之路

热门文章

  1. 利用定时器1实现流水灯
  2. 信息安全的江湖 只有圈内人玩的转
  3. 访问coding api
  4. 基于多策略改进的哈里斯鹰优化算法
  5. VBA基础知识整理(文件操作)
  6. 世界星载SAR发展10——RADAR1(1997,美国)
  7. 【bzoj2548】灭鼠行动解题报告
  8. 钳位二极管(保护用的)
  9. android客户端和服务端交互,谈谈android客户端和网站数据交互的实现
  10. Cause: java.sql.SQLException: connection closed问题排查、解决