重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现。

一、理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数) 

1、概述

图像二值化是图像处理中的一项基本技术,也是很多图像处理技术的预处理过程。

图像的预处理在进行图像二值化操作前要对图像进行预处理,包括彩色图像灰化和增强。由于选取阈值需要参照直方图,因此在图像进行处理后,我们再获取图像的直方图以帮助选取阈值。整个流程如下所示:

读取图像→灰度图像→图像增强→图像直方图→二值化处理

2、数学原理(转载,基本可以不用看,具体参看灰度图像二值化方法研究》

图像二值化是指用灰度变换来研究灰度图像的一种常用方法,即设定某一阈值将灰度图像的像素分成大于阈值的像素群和小于阈值的像素群两部分。例如输人灰度图像函数为,输出二值图像函数为,则

阈值(threshold )是把目标和背景区分开的标尺,选取适当的阈值就是既要尽可能保存图像信息,又要尽可能减少背景和噪声的干扰,这是选择阈值的原则。

图像的二值化处理就是将图像上的点的灰度置为0或255,也就是使整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

灰度图像的二值化处理有很多种方法,主要分为全局阈值法和局部阈值法。

全局阈值法

全局阈值法是指在二值化过程中只使用一个全局阈值的方法。它将图像的每个像素的灰度值与进行比较,若大于,则取为前景色(白色);否则,取为背景色。根据文本图像的直方图或灰度空间分布确定一个阈值,以此实现灰度文本图像到二值图像的转化。其中全局阈值法又可分为基于点的阈值法和基于区域的阈值法。阈值分割法的结果很大程度上依赖于对阈值的选择,因此该方法的关键是如何选择合适的阈值。

典型的全局阈值方法包括Otsu方法、最大熵方法等。全局阈值法算法简单,对于目标和背景明显分离、直方图分布呈双峰的图像效果良好,但对于由于光照不均匀、噪声干扰较大等原因使直方图分布不呈双峰的图像,二值化效果明显变差。若目标与背景之间灰度差不明显,可能出现大块黑色区域,甚至丢失整幅图像的信息;仅利用一维灰度直方图分布,没有结合图像的空间相关信息,处理效果不好;当图像中有断裂现象或者背景有一定噪声时,无法得到预期效果。

为了满足图像处理应用系统自动化及实时性要求,图像二值化的阈值的选择最好由计算机自动来完成。下面列举几个阈值的自动选择算法:

(1) 平均灰度值法:以图像中所有像素灰度值的平均值为阈值。

(2) 大津法:又称最大类间差法,是基于整幅图像的统计特性,实现阈值的自动选取。其原理是把图像直方图用某一灰度值分割成两类,分别计算这两类的像素点数和灰度平均值,然后计算它们的类间方差。当被分割成的两类类间方差最大时,此灰度值就作为图像二值化处理的阈值。大津法的使用范围比较广,不论图像的直方图有无明显的双峰,都能得到较满意的结果,在很多领域得到了应用和发展。但此方法依然存在一些不足,主要表现在:若目标与背景之间灰度差不明显,可能出现大块黑色区域,甚至丢失整幅图像的信息;仅利用一维灰度直方图分布,没有结合图像的空间相关信息,处理效果不好;当图像中有断裂现象或者背景有一定噪声时,无法得到预期效果。

(3) 边缘算子法:采用Laplace算子、Robert算子、Sober算子等对像素点进行灰度级增强或减弱的变换。对于灰度均匀分布的区域内的像素点,这些算子对其进行灰度减弱;对于在边缘附近的像素点,这些算子对其进行灰度增强。

局部阈值法

由当前像素灰度值与该像素周围点局部灰度特征来确定像素的阈值。例如可以将原图像划分为一些不相交的小块,将各块图像的灰度均值作为该部块图像的阈值,在局部上采用上面的整体阈值法。

对于目标和背景比较清楚的图像,全局阈值化方法可以取得较好结果。但是如果图像的背景不均匀,或目标灰度变化率比较大,全局方法便不再适用。局部阈值法是用像素灰度值和此像素邻域的局部灰度特性来确定该像素的阈值的。当照明不均匀、有突发噪声,或者背景灰度变化较大时,局部阈值确定技术必须根据像素的坐标位置关系自动确定不同阈值,实施动态的自适应二值化处理。局部阈值选取一般将图像划分为若干子图像,在每个子图像区域上使用整体阈值法,从而可以构成整幅图像的局部阈值法(根据每个子图像确定相应的阈值,具体的阈值确定方法同全局阈值的确定类似)。用这种方法分割后的图像在不同子图像的边界处有灰度的不连续分布,因此必须采用平滑技术来消除灰度的不连续性。

局部阈值法一般用于识别干扰比较严重、品质较差的图像,相对整体阈值方法有更广泛的应用,但也存在缺点和问题,如实现速度慢、不能保证字符笔画连通性以及容易出现伪影现象(即在背景域受到噪音干扰得到笔画结果)等。比较典型的局部二值化算法有Bernsen方法、多阈值的梯度强度法、基于纹理图像的方法、最大方差法等。

本文重点介绍全局固定阈值二值化,局部自适应阈值可参见下一篇文章。

3、优点

在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素的值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。二值图像在图像分析中应用非常广泛,二值图像就是指只有两个灰度级的图像,二值图像具有存储空间小,处理速度快,可以方便地对图像进行布尔逻辑运算等特点。更重要的是,在二值图像的基础上,还可以进一步对图像处理,获得该图像的一些几何特征或者其他更多特征。

二、程序实现

opencv编程方法可参看《图像的二值化和灰度化》和《【OpenCV入门指南】第四篇 图像的二值化

emgucv编程方法可参看《C# OpenCV学习笔记四之图像二值化

1、关键函数

根据《C# OpenCV学习笔记四之图像二值化》提供的方法,emgucv可以用两种函数实现二值化。

一种是cvThreshold,另一种是ThresholdBinary,下面分别介绍。

cvThreshold方法

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

C#
public static double cvThreshold(
IntPtr src,
IntPtr dst,
double threshold,
double maxValue,
THRESH thresholdType
)

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

Emgu.CV.CvEnum.THRESH中可以找到运算方法。

  Value Description
  CV_THRESH_BINARY 0 value = value > threshold ? max_value : 0
  CV_THRESH_BINARY_INV 1 value = value > threshold ? 0 : max_value
  CV_THRESH_TRUNC 2 value = value > threshold ? threshold : value
  CV_THRESH_TOZERO 3 value = value > threshold ? value : 0
  CV_THRESH_TOZERO_INV 4 value = value > threshold ? 0 : value
  CV_THRESH_MASK 7  
  CV_THRESH_OTSU 8 use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values

值得一说的是threshold_type可以使用CV_THRESH_OTSU类型,这样该函数就会使用大律法OTSU得到的全局自适应阈值来进行二值化图片,而参数中的threshold不再起作用。比如:cvThreshold( dst, dst,300 , 255,   CV_THRESH_OTSU | CV_THRESH_BINARY_INV);这种方法对于灰度直方图呈现二峰特征的图片处理起来效果很好。当然你也可以使用已有的OTSU算法来计算该阈值。

给窗体添加第四个PictureBox,并将SizeModel设置为Zoom

在均衡化功能函数后直接添加下段程序函数,阈值为30,so easy。

//二值化
Image<Gray, Byte> threshimg = new Image<Gray, Byte>(histmi.width, histmi.height);
CvInvoke.cvThreshold(histimage, threshimg, , , Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
pictureBox4.Image = threshimg.ToBitmap();

ThresholdBinary函数

emgucv提供的方法解释:Threshold the image such that: dst(x,y) = max_value, if src(x,y)>threshold; 0, otherwise。其实和cvThreshold函数中的第一种运算方法,即CV_THRESH_BINARY一样。

Image<Gray, Byte> threshimg= grayimg.ThresholdBinary(new Gray(), new Gray());

三、结果分析

与文章《【OpenCV入门指南】第四篇 图像的二值化》算法进行比对,不同方法下图片的处理结果。

原文章取阈值为111,实现的二值化效果。

利用emgucv编程,设定阈值为111获取的二值化效果图。

由于未能获取原始图像,只是通过截图获取的图片,不知截图过程中是否有图片损失。

通过肉眼比较,部分细节还是有些差别。

根据应用需要,调整阈值,从而获取最优效果。

转载请标明出处,原文地址:http://www.cnblogs.com/MobileBo/p/3918119.html

四、遗憾

阈值自适应调整目前还木有时间学习,抽时间看看吧。

[转载+原创]Emgu CV on C# (四) —— Emgu CV on 全局固定阈值二值化的更多相关文章

  1. [转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...

  2. 【转】Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...

  3. 【转载】opencv 二值化函数——cv2.threshold

    https://blog.csdn.net/weixin_38570251/article/details/82079080 threshold:固定阈值二值化, ret, dst = cv2.thr ...

  4. [转载+原创]Emgu CV on C# (二) —— Emgu CV on 灰度化

    本文主要对彩色图片灰度化的方法及其实现过程进行总结,最终给出Emgu CV实现的代码. 一.灰度化原理及数学实现(转载自——<图像灰度化方法总结及其VC实现> 该篇文章使用opencv实现 ...

  5. [转载+原创]Emgu CV on C# (七) —— Emgu CV on 轮廓检测

    轮廓检测 对于查找轮廓我们一般要对图像Canny检测.但是对于很特殊的场合其实我们还可以直接对二值化的图像进行轮廓的提取. 关键函数 1. cvFindContours Retrieves conto ...

  6. Emgu学习之(四)——图像阈值

    http://www.cnblogs.com/CoverCat/p/5043833.html Visual Studio Community 2015 工程和代码:http://pan.baidu.c ...

  7. [转载+原创]Emgu CV on C# (三) —— Emgu CV on 均衡化

    本文简要描述了均衡化原理及数学实现等理论问题,最终利用emgucv实现图像的灰度均衡. 直方图的均衡化,这是图像增强的常用方法. 一.均衡化原理及数学实现(转载) 均衡化原理及数学实现可重点参看——& ...

  8. [转载+原创]Emgu CV on C# (一) —— Emgu CV on Visual C# 2010

    2014-08-16 最近要进行图像识别,准备利用几天的时间研究一下Emgu CV,花了一晚上功夫进行调试环境安装,期间遇到了不少问题,现梳理一下安装过程和调试过程中出现的问题. 中间有转载别人的部分 ...

  9. 第四章 使用Docker镜像和仓库(二)

    第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...

随机推荐

  1. js获取iframe的parent对象

    使用谷歌浏览器调试代码时无意间发现了一个奇特的问题:从iframe页面调用父级页面的方法,window.parent.text(),出现 Blocked a frame with origin &qu ...

  2. 【CSS3】---样式小技巧

    水平居中设置-定宽块状元素 当被设置元素为块状元素时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素.这一小节我们先来讲一讲定宽块状元素. 满足定宽 ...

  3. Android点击其他任意位置收起软键盘

    在Android应用开发中,经常出现这样的需求,用户在输入文字的过程中,可能不想继续输入了,通过滑动或者点击其他位置(除软键盘和EditText以外的任何位置),希望能够自动收回键盘,这个功能可能有些 ...

  4. Part 82 to 85 Talking about Generic queue, stack collection class

    Part 82   Generic queue collection class Part 83   Generic stack collection class Part 84   Real tim ...

  5. 第七篇、OC_图片的裁剪基于SDWebImage

    前期有段时间困扰了我很久一个问题由于工程中的图片数据抓取自不同平台,所以图片的大小尺寸不一定,而放置图片的imageView尺寸是一定的,不作任何处理的话会导致图片拉伸变形,因此找了好久解决办法,现把 ...

  6. 个人收集的iOS开源动画-----长期跟新

    1. KYAnimatedPageControl 链接:KYAnimatedPageControl KYAnimatedPageControl 不仅可以在你滑动UIScrollView的时候自动以动画 ...

  7. [转]基于SQL脚本将数据库表及字段提取为C#中的类

    开发时,勉不了需要使用SQL直接与数据库交互,这时对于数据库中的表名及字段名会使用的比较多.如果每使用一次都复制一个,实在蛋疼.所以就考虑将其做成const常量.但是数据库中的表和字段相当多,一个一个 ...

  8. 【风马一族_Python】 更替pip的版本

    替换电脑上python中的pip的版本 例子: 下载的文件:pip-8.1.1-py2.py3-none-any.whl 下载地址:https://pypi.python.org/pypi/pip/# ...

  9. ADO.NET笔记——带参数的查询防止SQL注入攻击

    相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数 ...

  10. picLazyLoad 图片延时加载,包含背景图片

    /** * picLazyLoad 图片延时加载,包含背景图片 * $(img).picLazyLoad({...}) * data-original 预加载图片地址 * alon */ ;(func ...