忽略光照不均的影响做二值化,没想到自己毕设中设计的算法,竟然在07年就有人搞出来了、囧~

原文地址: http://people.scs.carleton.ca/~roth/iit-publications-iti/docs/gerh-50002.pdf

OpenCV源码地址: http://blog.csdn.net/qiaxi/article/details/49207243

图 1: 实时自适应图像二值化.

左: 输入图像. 中:Wellner算法.右: 本文算法.

[摘要] 图像二值化操作是很多计算机视觉及图形应用中的常见操作,其目标是区分某一像素点是“亮”还是“暗”。自适应二值化是图像二值化的一种,它考虑了光照的空间变化。本文提出了一种使用积分图进行实时自适应二值化的算法。该算法是对已有算法的改进,对光照变化的鲁棒性更高并且简单易实现。本文算法适用于处理实时视频数据流,可以作为诸如增强现实之类的交互应用的有力工具。算法源代码可从网上下载。

1      简介

图像的二值化是指根据图像的像素特征(比如灰度值)切分图像,目标是创建图像的二值表征,将每一个像素分为两类(比如“亮”和“暗”)中的某一类。这种操作在很多的图像处理应用以及计算机图形应用中非常常见。比方说,二值化经常包含在基于标记的增强现实系统(marker-based augmented realitysystem,专有词汇,如果翻译的不合适请见谅)[Billinghurst et al. 2001; Bradley and Roth 2004; Fiala 2005]的最初步骤中;它也已经应用于HDR影像技术[Ward 2003].

最基本的图像二值化是选定某一固定阈值,并将此阈值与各像素值进行比较。这些基本的二值化算法的介绍、比较以及评估可见于海量的文献中[Weszka and Rosenfeld 1978;Palumbo et al. 1986; Sahoo et al. 1988; Lee et al. 1990; Glasbey 1993; Trier and Jain 1995; Sezgin and Sankur 2004]. 然而,这些固定阈值的算法往往不能很好的适应光照的变化,也很难应用于视频流.

为了更好的适应光照的变化,最常见的方法是进行自适应二值化操作。该方法特殊的地方在于,它会为图像中的每一个像素点计算自己的阈值,从而对光照的变化保持一定的鲁棒性。学者们至今已经提出了很多种自适应二值化算法 [White and Rohrer 1983; Bernsen 1986; Parker 1991; Wellner 1993; Yang et al. 1994; Shen and Ip 1997; Chan et al. 1998; Savakis 1998; Sauvolaand Pietikainen 2000; Yang and Yan 2000]. 更多的例子及算法的比较可见于[Venkateswarlu and Boyle 1995; Sezgin and Sankur 2004]. 本文提出了一种利用积分图像的简单明了的算法。该算法易于实现,可应用于实时的视频数据。该算法是对现有算法[Wellner 1993]的改进,提高了对剧烈光照变化的适应性。此外,该算法简单明了,在提高了对剧烈光照变换的鲁棒性的同时,丝毫没有增加计算的复杂度。该算法与White、Rohrer共同提出的应用于OCR的二值化算法相似[White and Rohrer 1983],但是适用于实时视频。本算法的研究动机是找到增强现实应用的基准点。Pintaric也提出了一种为增强现实标记(augmented reality markers)而设计的二值化算法 [Pintaric 2003]. 但是该方法需要一个从前一帧获得的基准点,否则该算法无法很好的工作。本文算法无需假设,更加通用,适用于很多的应用场景。算法源码见于本文最后给出的网址。

2      背景

2.1      实时自适应二值化

本文着重于对视频帧的自适应二值化。为了确保实时性,算法对于每张图片的迭代次数必须尽可能少。二值化操作往往是一个更复杂操作的其中一步。比如对于增强现实而言,输入图像必须切分以定位已知标记,这些标记将用于动态地设定相机位置,因此简单快速的二值化算法是其中重要的工具。

2.2      积分图

积分图像(也被称为区域求和表)是一个非常有效的求和工具。当我们有一个从像素到数值(比如灰度值)的映射函数f(x, y),并且希望计算一个矩形区域内的函数值的和时,积分图是一个非常高效的工具。纹理映射[Crow 1984], 人脸识别[Viola and Jones 2004],以及立体匹配[Veksler2003]中均有积分图的应用. 如果不适用积分图,对于每个矩形而言,求和将是线性复杂度,因为将不得不累加每个像素的值。然而,如果我们需要计算多个互相重叠的窗口,我们可以使用积分图,这样可以将单个矩形的操作次数保持在固定值(复杂度1),从而获得对多个矩形求和时的总的线性复杂度。

为了计算积分图像,需要记录每个像素以及所有位于该点的左侧及上方的像素对应的值,f(x, y),的总和I (x,y)。 对于每个像素(x, y), 这个操作通过以下等式进行,为线性复杂度(考虑边界情况)

I(x, y) =f(x, y) + I(x−1, y)+I(x, y −1)− I(x−1, y − 1).                                                           (1)

图 2 (下面组图的左侧及中间位置)举例说明了积分图像的计算。中间图片是左侧图片的积分图。当我们计算完积分图之后,图片内任意矩形内的和便可以通过通过左上定点(x1, y1), 右下顶点(x2, y2)进行计算,计算方式如下:

  (2)

图2的右侧图像标示了计算方法。运用(2)中公式计算矩形D内f(x, y)的和,等价于计算 (A+B+C+D)-(A+B)-(A+C)+A.

图2: 积分图.

左: 输入图像. 中间: 左侧图像的积分图. 右侧: 使用积分图计算矩形D内f(x,y)的和.

3      算法综述

本文所述算法是Wellner 算法 [Wellner 1993]的扩展,Wellner算法的核心思想是将每个像素点与周围像素点的均值作比较。特别地,遍历图像时,计算(已遍历的)最后s个像素的均值,如果当前像素的值比该均值小 t %,那么该像素点设置为黑,否则为白色。该方法之所以有效是因为将某一像素与相邻像素相比较将保留对比明显的部分并忽略平滑的过渡。本算法的一大优点在于只需要遍历一次图像。Wellner 采用1/8图像宽度作为s的值,并将百分比参数t设置为15. 然而,这种算法也有一个问题: 算法依赖于遍历的方向。此外,不断移动的s个像素的均值并不是在每一步都是周围像素均值的一种良好表现,因为相邻像素并不总是各向平滑分布的。通过使用积分图(对图像进行一次额外的遍历),我们提出了一种不被这些问题困扰的算法。这种算法简单,直接,易于编程实现,并且可以对同一图像产生稳定的输出结果。与计算最后s个像素的均值不同,本文所述算法计算中心像素周围的s×s邻域内像素均值。这种处理方法表现更加稳定因为它考虑了所有方向的相邻像素。通过使用积分图,邻域均值的计算为线性复杂度。第一次遍历图像时计算图像的积分图,第二次遍历时,通过积分图为每个像素以恒定计算次数计算邻域均值,然后将此均值与当前像素点的数值进行比较。如果当前像素的值比邻域均值低t %则设为黑,否则设为白。

以下伪代码中,in 为输入图像,out为输出的二值图像, w 和 h 分别代表图像的宽度和高度.

procedure AdaptiveT hreshold(in, out, w, h)

1: for i = 0 to w do

2:       sum ← 0

3:       for j = 0 to h do

4:            sum ← sum + in[i, j]

5:            if i = 0 then

6:                 intImg[i,j] ← sum

7:            else

8:                 intImg[i, j]← intImg[i −1, j] + sum

9:            end if

10:       end for

11:  end for

12: for i = 0 to w do

13:     for j = 0 to h do

14:         x1 ← i − s/2 {此处未显示边界处理}

15:        x2 ← i + s/2

16:          y1 ← j − s/2

17:        y2 ← j + s/2

18:           count ← (x2 − x1)×(y2− y1)

19:      sum ← intImg[x2, y2]− intImg[x2, y1−1]− intImg[x1− 1, y2]+ intImg[x1−1, y1 − 1]

20:           if (in[i, j]× count)≤(sum × (100 − t)/100) then

21:               out[i, j] ← 0

22:            else

23:               out[i, j] ← 255

24:          end if

25:       end for

26:  end for

4      实验结果

本文所述算法在3.4GHz 的 Pentium 4 处理器上测试,采用Point GrayDragonfly相机捕捉640×480像素的图像。测试结果为,每帧的平均处理时间为15毫秒,帧率约为65帧每秒。因为该算法需要遍历图像两次,而不是像Wellner算法一样只遍历一次,因此会慢一些。测试发现,该算法比Wellner算法慢了2.5倍,但是依然达到了实时性的要求。

图1和图3展示了本算法的测试结果,同时展示了Wellner算法的效果。图1展示了一张文本图像,其中一个区域平均灰度值极小,本文算法依然可以完整地切分出所有的文字。图3是一个增强现实的例子,显示的是在一段视频中用于追踪的平面标记。本例中,虽然光照变化明显,本文提出的算法依然达到了近乎完美的效果。Wellner算法在底部中心区域因为反射影像表现不佳,在上部的角落处也产生了明显的阴影。

图 3: 增强现实例子.

左: 输入图像. 中: Wellner算法. 又: 本文算法.

5      分析讨论

我们以前在增强现实方面的工作[Bradley and Roth 2004]论证了应用于视频的实时的、高鲁棒性的、自适应二值化算法的需要 。本文所述的算法完全适应强光照变化的场景。

短暂的光照变化可以自动处理,而这种情况全局的阈值方法无法处理。本算法的主要缺点在于需要遍历图像两次。不过,对于当前的处理器而言,这并不是很大的缺点,该算法依然可以满足实时性需求。

可以通过以下方法将计算处理的次数降到最低:在(i, j)位置计算积分图的同时在(i − s/2, j − s/2) 位置进行二值化操作。这种情况下,以下数目的像素将需要执行常数次计算:

该方法假设图像主要包含背景像素(标记为白色),前景零散地分布于整张图像。当一个前景部分大于s×s像素时,前景的中心将被错分为背景。使用更大的核(比如增大s)将减轻这种影响,但是这种情况下将丢失更多的图片细节。核的大小应当根据不同应用设定相应的值。

参考文献

BERNSEN, J.  1986. Dynamic thresholding of gray-level images.  In Int. Conf. Pattern Recognition, vol. 2, 1251– 1255.

BILLINGHURST, M., KATO, H., AND POUPYREV, I. 2001. Themagicbook - moving seamlessly betweenreality and virtuality.IEEE Comput. Graph. Appl.21, 3, 6–8.

BRADLEY, D., AND  ROTH, G. 2004. Augmenting non-rigid objects with realistic lighting.Tech. Rep. NRC 47398, National Research Council of Canada, October.

CHAN, F. H. Y., LAM, F. K., AND ZHU, H. 1998. Adaptive thresholding by variational method.IEEE Transactions on Image Processing7, 3 (March),468–473.

CROW, F. C. 1984. Summed-area tablesfor texture mapping. SIGGRAPH Comput.Graph. 18, 3, 207–212.

FIALA, M.   2005.  ARTag, a fiducialmarker system using digitaltechniques.  InProc. of Computer Vision and Pattern Recognition, vol. 2, 590–596.

GLASBEY, C. A. 1993. An analysisof histogram-based thresholding algorithms.  CVGIP: Graph. ModelsImage Process. 55, 6, 532–537.

LEE, S., CHUNG, S., AND PARK, R. 1990. A comparative performance study of several global thresholding techniques for segmentation.Computer Vision Graphics Image Processing52, 2 (Nov.), 171–190.

PALUMBO, P. W., SWAMINATHAN, P., AND  SRIHARI, S. N. 1986. Document image binarization: Evaluationof algorithms.SPIE 697, 278–285.

PARKER, J. R. 1991. Gray level thresholding in badly illuminated images. IEEE Trans. Pattern Anal. Mach. Intell.

13, 8, 813–819.

PINTARIC, T. 2003. An adaptive thresholding algorithmfor the augmented reality toolkit.InIEEE Int. Augmented Reality Toolkit Workshop.

SAHOO, P. K., SOLTANI, S., WONG, A. K., AND CHEN, Y. C.  1988.  A survey of thresholding techniques.

Comput. Vision Graph. Image Process. 41, 2, 233–260.

SAUVOLA, J., AND PIETIKAINEN, M. 2000. Adaptive document image binarization. PR 33,2 (February), 225–236.

SAVAKIS, A. E. 1998. Adaptive documentimage thresholding using foregroundand background clustering.  In

ICIP (3), 785–789.

SEZGIN, M., AND  SANKUR, B.  2004. Survey over image thresholding techniques and quantitative performance evaluation.Journal of Electronic Imaging 13, 1, 146–168.

SHEN, D., AND IP, H. H. S. 1997. A hopfield neural network for adaptive image segmentation: An active surface paradigm.PRL 18, 37–48.

TRIER, O. D., AND JAIN, A. K. 1995. Goal-directed evaluationof binarization methods.PAMI 17, 12 (December), 1191–1201.

VEKSLER, O. 2003. Fast variable window for stereo correspondence usingintegral images.InIEEE Conference on Computer Vision and Pattern Recognition(CVPR 2003), 556–661.

VENKATESWARLU, N. B., ANDBOYLE, R. D. 1995. New segmentation techniques for document image analysis.

IVC 13, 7 (September), 573–583.

VIOLA, P., AND JONES, M. J. 2004. Robust real-time face detection. Int. J. Comput.Vision 57, 2, 137–154.

WARD, G. 2003. Fast, robust image registration for compositing high dynamic range photographs from hand-held exposures.journal of graphics tools 8, 2, 17–30.

WELLNER, P. D. 1993. Adaptive thresholding for the digitaldesk. Tech. Rep. EPC-93-110, EuroPARC.

WESZKA, J. S., AND ROSENFELD, A.  1978. Threshold evaluationtechniques.  IEEE Trans. on System, Man and Cybernetics SMC-8, 8, 622–629.

WHITE, J. M., AND ROHRER, G. D. 1983.Image thresholding for optical characterrecognition and other applica- tions requiringcharacter image extraction.IBMRD 27, 4 (July), 400–411.

YANG, Y., AND YAN, H. 2000. An adaptive logical method for binarization of degraded document images.PR 33, 5 (May), 787–807.

YANG, J. D., CHEN, Y. S., AND HSU, W. H.  1994.Adaptive thresholding algorithmand its hardware implemen- tation.PRL 15, 141–150.

其他信息:

// 链接貌似失效了

本文源码及更多图像实例见于 www.derekbradley.ca/AdaptiveThresholding/index.html.

使用积分图像进行自适应二值化[Derek Bradley, Gerhard Roth, 2007]相关推荐

  1. input自适应_【正点原子FPGA连载】第十一章基于OV5640的自适应二值化实验-领航者ZYNQ之HLS 开发指南...

    1)摘自[正点原子]领航者ZYNQ之HLS 开发指南 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手 ...

  2. 利用python opencv实现图像自适应二值化

    对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一.例如,灰度大于127的图像设置为1.小于127的设置为0,这种处理便是固定阈值127的二值化处理. 自适应的二值化处理不同于固定阈 ...

  3. Python+OpenCV图像处理(五)——图像阈值和二值化

    系列文章 Python+OpenCV图像处理(一)--OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)--几何变换 Python+OpenCV图像处理(三)--彩色空间互换 P ...

  4. opencv自适应二值化原理

    opencv自适应二值化原理 先对图像做模糊处理(一般是均值或者高斯模糊).(这里可以加上自己的操作,做一些其他类型的模糊以及一些形态学的操作). 用原图与模糊处理之后的图像做差得到一幅图像. 判断图 ...

  5. emgucv自适应二值化

    一.理论概述(转载自<OpenCV_基于局部自适应阈值的图像二值化>) 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化 ...

  6. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  7. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  8. vc++数字图像处理 自适应二值化程序

    这段时间做图像处理,这是用迭代法求阈值的,自适应二值化代码,贴出来希望对大家有帮助 void GrayTrans::Binary() { long i,j; unsigned char pixel; ...

  9. 图像灰度、二值化、膨胀和腐蚀(纯Java篇)

    在c.c++或者python环境中可以使用opencv非常容易实现图像灰度.二值化.膨胀和腐蚀等功能:但在java环境中,使用opencv来处理相对比较麻烦,简单的操作用opencv处理也相对过重,这 ...

  10. 图像预处理(二值化)

    图像预处理(二值化) 本文的实验是主要通过opencv与python3实现,相关的代码可以在GitHub中找到. 1. 图像获取与灰度化 通过摄像头获取到的图像为彩色的图像.彩色图像主要分为两种类型, ...

最新文章

  1. java hanoi_Hanoi问题java解法
  2. 腾讯绝地求生手游席卷全球,104个国家地区IOS登顶
  3. python Manager dict
  4. C#WIFI搜索与连接
  5. 中缀表达式计算、后缀表达式计算、中缀转后缀
  6. 嵌入式linux开发考试题目,练一练!3道经典嵌入式Linux面试题,答案在文末。
  7. python抽荣耀水晶_深度分析抽取荣耀水晶的窍门,不良抽法很好用,平均100RMB一颗...
  8. jmeter 聚合报告说明_jmeter之聚合报告
  9. stm32运行java_STM32之——3种启动方式学习
  10. Cron, PAM, OpenDNS 介绍
  11. Kaggle实战之leaf classification(树叶分类)
  12. html中在线取色器,在线取色器(ColorPicker)的制造方式
  13. icmp判断可达_伪造目标不可达的ICMP数据包
  14. local class incompatible: stream classdesc serialVersionUID = -6513709415809811854, local class seri
  15. win10无法打开超链接,组织策略阻止
  16. 禅道二次开发(三):二次开发实例
  17. 【一周头条盘点】中国软件网(2018.4.9~2018.4.13)
  18. 学习HTML+CSS知识点
  19. 一品制药创业板IPO过会:年营收3.82亿 拟募资5亿
  20. 熊猫分发_熊猫实用指南

热门文章

  1. 4.2.4 图像色调处理
  2. 如何用控制台cmd打开你的c++程序
  3. 解决Windows10更新后点击左下角开始图标无反应【报错0x800f081f】或点击个性化提示【ms-settings:personalisation-background】错误
  4. 但行好事 莫问前程(九月)
  5. 工作流与BPM的区别
  6. 专家学者热议智慧交通:大数据云计算,出行有“千里眼”
  7. 标准c语言程序文件名后缀为,CCS_C语言编程
  8. 认知升级是令我们变得优秀的重要基石,没有之一
  9. QT学习笔记(一)之本地播放器
  10. UE4 坐标系 坐标轴旋转轴