基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值
1、描述:
此方法实用于具有明显双峰直方图的图像,其寻找双峰的谷底作为阈值,但是该方法不一定能获得阈值,对于那些具有平坦的直方图或单峰图像,该方法不合适。
2、实现过程:
该函数的实现是一个迭代的过程,每次处理前对直方图数据进行判断,看其是否已经是一个双峰的直方图,如果不是,则对直方图数据进行半径为1(窗口大小为3)的平滑,如果迭代了一定的数量比如1000次后仍未获得一个双峰的直方图,则函数执行失败,如成功获得,则最终阈值取两个双峰之间的谷底值作为阈值。
注意在编码过程中,平滑的处理需要当前像素之前的信息,因此需要对平滑前的数据进行一个备份。另外,首数据类型精度限制,不应用整形的直方图数据,必须转换为浮点类型数据来进行处理,否则得不到正确的结果。
3、实现代码:
int GetMinimumThreshold(int* HistGram)
{int Y, Iter = 0;double *HistGramC = new double[256]; // 基于精度问题,一定要用浮点数来处理,否则得不到正确的结果double *HistGramCC = new double[256]; // 求均值的过程会破坏前面的数据,因此需要两份数据for (Y = 0; Y < 256; Y++){HistGramC[Y] = HistGram[Y];HistGramCC[Y] = HistGram[Y];}// 通过三点求均值来平滑直方图while (IsDimodal(HistGramCC) == false) // 判断是否已经是双峰的图像了 {HistGramCC[0] = (HistGramC[0] + HistGramC[0] + HistGramC[1]) / 3; // 第一点for (Y = 1; Y < 255; Y++)HistGramCC[Y] = (HistGramC[Y - 1] + HistGramC[Y] + HistGramC[Y + 1]) / 3; // 中间的点HistGramCC[255] = (HistGramC[254] + HistGramC[255] + HistGramC[255]) / 3; // 最后一点System.Buffer.BlockCopy(HistGramCC, 0, HistGramC, 0, 256 * sizeof(double));Iter++;if (Iter >= 1000) return -1; // 直方图无法平滑为双峰的,返回错误代码 }// 阈值极为两峰之间的最小值 bool Peakfound = false;for (Y = 1; Y < 255; Y++){if (HistGramCC[Y - 1] < HistGramCC[Y] && HistGramCC[Y + 1] < HistGramCC[Y]) Peakfound = true;if (Peakfound == true && HistGramCC[Y - 1] >= HistGramCC[Y] && HistGramCC[Y + 1] >= HistGramCC[Y])return Y - 1;}return -1;}
其中IsDimodal函数为判断直方图是否是双峰的函数,代码如下:
bool IsDimodal(double* HistGram) // 检测直方图是否为双峰的 {// 对直方图的峰进行计数,只有峰数位2才为双峰 int Count = 0;for (int Y = 1; Y < 255; Y++){if (HistGram[Y - 1] < HistGram[Y] && HistGram[Y + 1] < HistGram[Y]){Count++;if (Count > 2) return false;}}if (Count == 2)return true;elsereturn false;}
基于直方图的图像全局二值化算法原理、实现--基于谷底最小值的阈值相关推荐
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)
源:十三种基于直方图的图像全局二值化算法原理.实现.代码及效果.
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果
十三种基于直方图的图像全局二值化算法实现 1. 什么是基于直方图的图像全局二值化算法 2. 灰度平均值 3. 百分比阈值(P-Tile法) 3. 基于双峰的阈值 3.1 基于平均值的阈值 3.2 基于 ...
- 十三种基于直方图的图像全局二值化算法原理、实现、代码及效果。
图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产 ...
- matlab最小分类错误全局二值化算法
转自:http://download.csdn.net/detail/hupeng810/1511870 function imagBW = kittlerMet(imag) % KITTLERMET ...
- 不均匀光照文本图像的二值化
本文转载自:http://blog.csdn.net/u013162930/article/details/47755363 不均匀光照文本图像的二值化. 因为文本图像的背景是不均匀的,所以想先求出图 ...
- matlab确定灰度阈值T,matlab灰度图像二值化【灰度图像二值化算法研究】
摘要: 在很多图像处理的过程中,经常需要对灰度图像进行二值化.本文对几种常用的图像二值化算法进行了阐述,并通过仿真,进行比较研究.根据实验结果,阐明了各种算法的优缺点. Abstract: The b ...
- C#,图像二值化(12)——基于谷底最小值的全局阈值算法(Valley-Minium Thresholding)与源代码
1.基于谷底最小值的阈值 这个方法适用于通过有限的迭代次数,平滑后能得到双峰的图像,让双峰的谷底成为阈值.当执行完基于谷底最小值的阈值操作的时候,改变了直方图信息,使之成为处理过后的直方图信息,这时候 ...
- 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))
目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...
- 利用Python实现图像的二值化
目录 1.全局阈值法 1.1主要函数: 1.2全局阈值的代码实现 1.3特点 2.自适应阈值法 2.1主要函数: 2.2实现代码: 2.3特点: 3.OTSU二值化(最大类间方差法) 3.1实现代码: ...
最新文章
- Android Chromium WebView Crash
- UIRefreshControl使用总结
- python——json数据
- php源码安装空白,源代码安装完成后,页面一片空白?
- 第十三期:你不想错过的那些JSON工具
- AOP面向切面编程 淘宝京东网络处理
- 入行Java能做什么?亿级畅销书作者李刚在线解答!
- 杀戮尖塔 地图生成器参考
- 程序员的自我修养(雾)
- 一篇文章搞懂 Hadoop RPC 到底是什么
- 一阶电路暂态响应的结果分析。_【技术】关于开关电源的分析、计算、仿真
- Linux系统打印机打印乱码,Linux输入中文乱码问题(亲测有效)
- 我不喜欢代码,却为何坚持做程序员?
- 什么是虚拟机,有什么用?
- C++中继承 —— 继承的概念及定义
- Python 下载视频出错 you-get: [error] oops, something went wrong.
- 计算机tcpip网络原理与应用,清华大学出版社-图书详情-《TCP/IP网络编程原理与技术》...
- Unity UGUI图集打包与动态使用(TexturePacker)
- C# 文本转语音朗读
- 黑马程序员--Objective-C之--自动释放池的概念以及使用