局部自适应阈值二值化

相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测。

一、理论概述(转载自《OpenCV_基于局部自适应阈值的图像二值化》)

局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。常用的局部自适应阈值有:1)局部邻域块的均值;2)局部邻域块的高斯加权和。

二、程序实现

1、关键函数

关键函数 CvInvoke.cvAdaptiveThreshold Method

函数功能:

Transforms grayscale image to binary image. Threshold calculated individually for each pixel. For the method CV_ADAPTIVE_THRESH_MEAN_C it is a mean of blockSize x blockSize pixel neighborhood, subtracted by param1. For the method CV_ADAPTIVE_THRESH_GAUSSIAN_C it is a weighted sum (gaussian) of blockSize x blockSize pixel neighborhood, subtracted by param1.

函数原型:

public static void cvAdaptiveThreshold(

IntPtr src,

IntPtr dst,

double maxValue,

ADAPTIVE_THRESHOLD_TYPE adaptiveType,

THRESH thresholdType,

int blockSize,

double param1

)

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

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

第三个参数maxValue表示采用CV_THRESH_BINARY 和CV_THRESH_BINARY_INV门限类型的最大值。

第四个参数adaptiveType表示局部二值化阈值的取值方法,自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C,ADAPTIVE_THRESHOLD_TYPE枚举类型

Member name Value Description
CV_ADAPTIVE_THRESH_MEAN_C 0 indicates that "Mean minus C" should be used for adaptive threshold.
CV_ADAPTIVE_THRESH_GAUSSIAN_C 1 indicates that "Gaussian minus C" should be used for adaptive threshold.

第五个参数thresholdType表示取阈值类型:必须是下者之一

  • CV_THRESH_BINARY,
  • CV_THRESH_BINARY_INV

第六个参数block_size代表用来计算阈值的象素邻域大小,例如:3,5,7…

第七个参数表示均值或高斯加权平均值所需要减去的一个常数,类似一个人工干预的阈值调整。

对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。

对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。

2、编程实现

采用均值法设定局部适应阈值,块大小为25,参数取值为5.

//局部二值化
Image<Gray, Byte> adaptivethreshimg = new Image<Gray, Byte>(graymi.width, graymi.height);
CvInvoke.cvAdaptiveThreshold(grayimg, adaptivethreshimg, 255, Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, 25, 5);
pictureBox4.Image = adaptivethreshimg.ToBitmap();

与《OpenCV_基于局部自适应阈值的图像二值化》比对

采用本文算法获取的二值化图像

第五个参数本文用的是Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY,刚好与原文相反,因此一个是白底,一个是黑底。

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

三、结果分析

1、边缘提取作用

有人提出cvAdaptiveThreshold的作用不是二值化而是提取对象边缘的观点

参考文献:http://wuyiwangyi.blog.163.com/blog/static/3214949520093834537412/

《关于cvAdaptiveThreshold的一点收获》

关键是里面的block_size参数,该参数是决定局部阈值的block的大小,当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数。当把block_size设为比较大的值时,如block_size=21 or 31 or 41时,cvAdaptiveThreshold便是二值化函数啦~

2、block_size取值问题

编程过程中,发现block_size一般取奇数,如果取偶数会报错,错误内容是"blockSize % 2 == 1 && blockSize > 1"。当然,编程文档说明提示是3,5,7,...,并没有要求是奇数,是这种算法在原理上就要这么要求吗?还是编程需要?我无法解答。

网上说源代码要求就是 if( size <= 1 || (size&1) == 0 )
        CV_ERROR( CV_StsOutOfRange, "Neighborhood size must be >=3 and odd (3, 5, 7, ...)" );

个人感觉是图像处理算法本身导致的,与编程无关。

转载于:https://www.cnblogs.com/MobileBo/p/3923599.html

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

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

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

  2. OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别: 对图像进行二值化处理,对[ cv.threshold ]函数的理解. 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为 ...

  3. [转载] python3 opencv 图像二值化笔记(cv2.adaptiveThreshold)

    参考链接: python opencv 基础6: cv2.threshold()二值图像 前一篇研究了opencv二值化方法threshold的使用,但是这个方法也存在一定的局限性,假如有一张图存在明 ...

  4. java 求集合平均数_图像二值化方法介绍(转载学习)

    ImageJ中图像二值化方法介绍 概述 二值图像分析在对象识别与模式匹配中有重要作用,同时也在机器人视觉中也是图像处理的关键步骤,选择不同图像二值化方法得到的结果也不尽相同.本文介绍超过十种以上的基于 ...

  5. 图像五值化与基于三值图像的车牌识别(1)

    庆祝2011年新年 张忠义 海口愚佬会教育科技有限公司 全文下载 www.yulaohui.com/color5_2/ 摘 要:      图像五值化是通过公式Y =(R+G)/2,将RGB空间映射到 ...

  6. CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)

    引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...

  7. python中cock什么意思_[转载]原创脚本逐步实现Autodcock-Vina的虚拟筛选及筛选后分析...

    [转载]原创脚本逐步实现Autodcock-Vina的虚拟筛选及筛选后分析 (2013-07-03 11:31:56) 标签: 转载 Vina是在Autodock4基础上改进的算法,相比autodoc ...

  8. [转载+原创]J2ME开发工具使用感受

    http://www.3geye.net/?3/viewspace-440 为什么我这篇文章是说[转载+原创] 因为这里面的内容包含了 http://www.blogjava.net/fastpace ...

  9. (五)比赛中的CV算法(上)cv基础知识和opencv的api

    5.比赛中的CV算法 讲了这么多,视觉组的重头戏--算法终于来了. 在大部分时候我们都不需要设计底层的算法,而是直接调用封装好的API,设计更具体的应用于特定问题的算法.当然,有必要了解一下造轮子(底 ...

最新文章

  1. Clip Studio Paint 高级着色学习教程
  2. 网站设计与开发流程图
  3. 【直播课】6小时教你掌握MMdetection工程落地实践
  4. 如何通过控制台访问openstack实例_如何通过seo提高网站设计的访问量
  5. 盛辉智能机器人安全吗_人工智能真的安全吗?快看这些已经发出的警告
  6. spring aop中使用@Pointcut注解抽取可重用的切入点表达式
  7. 阿里45K高级Java岗,必备技能清单
  8. mysql5.7绿色版安装与卸载教程
  9. 指数基金的正确购买姿势
  10. Java编程入门基础知识合集
  11. 般若波罗蜜多心经白话分段解释
  12. C++关键字及其详解
  13. 我的一个项目:项目可行性分析报告
  14. antd 实现 sidebar 左侧菜单·记
  15. MySQL占用CPU过高,排查原因及解决的多种方式法
  16. python初始画笔_Python自带Turtle画笔的原理
  17. linux匹配字符串型号,Linux shell脚本:如何匹配子字符串和正则表达式
  18. 【通信仿真】基于matlab空时自适应处理降维仿真【含Matlab源码 1957期】
  19. VOA 2009年11月25日 星期三探索发现——全球街舞音乐尽显自我
  20. 《OpenCV支持的图片格式》

热门文章

  1. css3动画模块transform transition animation属性解释
  2. 在matlab中如何使用SVM工具箱
  3. Linux下为文件增加列的shell脚本
  4. 2012年欧洲杯德国战车止步四强赛
  5. 数据结构源码笔记(C语言):二分查找
  6. python编程基础人民邮电出版社_Python编程基础与应用
  7. Web三大组件的注册——Servlet、Filter、Listener(监听三大作用域: ServletContext、HttpSession、ServletRequest )
  8. redis的数据结构||1) 字符串类型2) 哈希类型3) 列表类型4) 集合类型 5) 有序集合类型详解
  9. mybatis执行查询的所有分析和创建代理对象的分析
  10. Docker selenium自动化 - 使用python操作docker,python运行、启用、停用和查询容器实例演示