局部自适应阈值二值化

相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用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, , Emgu.CV.CvEnum.ADAPTIVE_THRESHOLD_TYPE.CV_ADAPTIVE_THRESH_MEAN_C, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY, , );
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, ...)" );

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

[转载+原创]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 全局固定阈值二值化

    重点介绍了全局二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也 ...

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

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

  4. 机器学习实战基础(十二):sklearn中的数据预处理和特征工程(五) 数据预处理 Preprocessing & Impute 之 处理分类特征:处理连续性特征 二值化与分段

    处理连续性特征 二值化与分段 sklearn.preprocessing.Binarizer根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量.大于阈值的值映射为1,而小于或等于阈值的值 ...

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

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

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

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

  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. 【Visual C++】游戏开发五十六 浅墨DirectX教程二十三 打造游戏GUI界面(一)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/16384009 作者:毛星云 ...

随机推荐

  1. .net core i上 K8S(四).netcore程序的pod管理,重启策略与健康检查

    上一章我们已经通过yaml文件将.netcore程序跑起来了,但还有一下细节问题可以分享给大家. 1.pod管理 1.1创建pod kubectl create -f netcore-pod.yaml ...

  2. c# 变量交换

    C#  变量交换 变量交换的方法: 1.借助第三个变量: class Program { static void Main(string[] args) { Exchage(,); } /// < ...

  3. 921. Minimum Add to Make Parentheses Valid

    Given a string S of '(' and ')' parentheses, we add the minimum number of parentheses ( '(' or ')', ...

  4. KVM虚拟环境安装

    关闭防火墙 linux 半虚拟化是不能运行与安装KVM虚拟机的. #egrep '(vmx|svm)' --color=always /proc/cpuinfo yum -y install kvm ...

  5. 模块time, datetime的用法

    一. time  time库提供了各种操作时间的方法   1. time.asctime([tuple]):将一个时间元组转换成一个可读的24个时间字符串. >>> time.asc ...

  6. 重置root密码

    一. ubuntu忘记密码解决方法 1. 开机按shift 2. 选择高级选项,进入后选择恢复模式(不要按回车),按e进入编辑模式 3. 修改linux命令中的recovery nomodest 为 ...

  7. 最短路 CF954D Fight Against Traffic

    CF954D Fight Against Traffic 题意描述: 给你一张无向图,一共有n个点(2 <= n <= 1000),由m条边连接起来(1 <= m <= 100 ...

  8. js和jquery获取属性的区别

    一.获取元素: js获取元素: 根据id获取:document.getElementById("id"); 根据类名获取:document.getElementsByClassNa ...

  9. asp 程序 转 php

    常年做web的,工作需要,可能有的时候需要将asp代码批量转换成php,最近发现一个小东西很不错,虽不能100%转换(毕竟是程序),但是大大提高了工作效率 Asp2Php是一个可以将ASP转化成PHP ...

  10. Drupal Coder 模块远程命令执行分析(SA-CONTRIB-2016-039)

    转载请注明文章出处:http://www.cnblogs.com/magic-zero/p/5787181.html 起初看到这个漏洞的时候是在exploit-db上边.地址在这里:https://w ...