OSTU大律法二值化原理
介绍
Ostu方法又名最大类间差方法,通过统计整个图像的直方图特性来实现全局阈值T的自动选取,其算法步骤为:
1) 先计算图像的直方图,即将图像所有的像素点按照0~255共256个bin,统计落在每个bin的像素点数量
2) 归一化直方图,也即将每个bin中像素点数量除以总的像素点
3) i表示分类的阈值,也即一个灰度级,从0开始迭代
4) 通过归一化的直方图,统计0~i 灰度级的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例w0,并统计前景像素的平均灰度u0;统计i~255灰度级的像素(假设像素值在此范围的像素叫做背景像素) 所占整幅图像的比例w1,并统计背景像素的平均灰度u1;
5) 计算前景像素和背景像素的方差 g = w0*w1*(u0-u1) (u0-u1)
6) i++;转到4),直到i为256时结束迭代
7)将最大g相应的i值作为图像的全局阈值
代码:
- #include <opencv2/opencv.hpp>
- #include <opencv2/core.hpp>
- #include <opencv2/imgproc.hpp>
- #include <opencv2/highgui.hpp>
- using namespace cv;
- using namespace std;
- //输入图像,输出阈值
- int otsu(IplImage *image)
- {
- assert(NULL != image);
- int width = image->width;
- int height = image->height;
- int x = 0, y = 0;
- int pixelCount[256];
- float pixelPro[256];
- int i, j, pixelSum = width * height, threshold = 0;
- uchar* data = (uchar*)image->imageData;
- //初始化
- for (i = 0; i < 256; i++)
- {
- pixelCount[i] = 0;
- pixelPro[i] = 0;
- }
- //统计灰度级中每个像素在整幅图像中的个数
- for (i = y; i < height; i++)
- {
- for (j = x; j < width; j++)
- {
- pixelCount[data[i * image->widthStep + j]]++;
- }
- }
- //计算每个像素在整幅图像中的比例
- for (i = 0; i < 256; i++)
- {
- pixelPro[i] = (float)(pixelCount[i]) / (float)(pixelSum);
- }
- //经典ostu算法,得到前景和背景的分割
- //遍历灰度级[0,255],计算出方差最大的灰度值,为最佳阈值
- float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;
- for (i = 0; i < 256; i++)
- {
- w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
- for (j = 0; j < 256; j++)
- {
- if (j <= i) //背景部分
- {
- //以i为阈值分类,第一类总的概率
- w0 += pixelPro[j];
- u0tmp += j * pixelPro[j];
- }
- else //前景部分
- {
- //以i为阈值分类,第二类总的概率
- w1 += pixelPro[j];
- u1tmp += j * pixelPro[j];
- }
- }
- u0 = u0tmp / w0;//第一类的平均灰度
- u1 = u1tmp / w1;//第二类的平均灰度
- u = u0tmp + u1tmp;//整幅图像的平均灰度
- //计算类间方差
- deltaTmp = w0 * (u0 - u)*(u0 - u) + w1 * (u1 - u)*(u1 - u);
- //找出最大类间方差以及对应的阈值
- if (deltaTmp > deltaMax)
- {
- deltaMax = deltaTmp;
- threshold = i;
- }
- }
- //返回最佳阈值;
- return threshold;
- }
- int main(int argc, char* argv[])
- {
- IplImage* srcImage = cvLoadImage("1.jpg", 0);
- assert(NULL != srcImage);
- cvNamedWindow("src");
- cvShowImage("src", srcImage);
- IplImage* biImage = cvCreateImage(cvGetSize(srcImage), 8, 1);
- //计算最佳阈值
- int threshold = otsu(srcImage);
- //对图像二值化
- cvThreshold(srcImage, biImage, threshold, 255, CV_THRESH_BINARY);
- cvNamedWindow("binary");
- cvShowImage("binary", biImage);
- cvWaitKey(0);
- cvReleaseImage(&srcImage);
- cvReleaseImage(&biImage);
- cvDestroyWindow("src");
- cvDestroyWindow("binary");
- return 0;
- }
缺陷
OSTU算法在处理光照不均匀的图像的时候,效果会明显不好,因为利用的是全局像素信息。
转载自:https://www.baidu.com/link?url=21OGa8h2Y_vtzmcp6069mpnezweNfZu-pvgyc5mX9kkzEwAd1uFQelWPzl0JORF_fVg2vDOvevLm9U4GHCobHmGi7ISbTk6QezPQ7FQf4eG&wd=&eqid=c933dd3e00041dbc000000045c727c44
OSTU大律法二值化原理相关推荐
- otsu阈值分割算法原理_大津二值化算法OTSU的理解
otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...
- C++实现大津二值化算法
文章目录 一.大津算法 二.原理 三.算法实现步骤 四.测试结果 五.完整代码 一.大津算法 大津算法(Ostu)也称最大类间方差法.顾名思义,就使两个类别之间某个属性的方差最大的方法.在图像处理中, ...
- 大津二值化算法 ( Otsu's binarization ) 自动确定二值化图像时的阈值
大津算法,也被称作最大类间方差法,是一种自动确定二值化阈值的算法. 在这里作者不介绍算法推导的过程,算法推导过程网络上有许多介绍,这里只给出算法最终推导出的结论: 使得左侧 的值最大,就可以得到最好的 ...
- opencv自适应二值化原理
opencv自适应二值化原理 先对图像做模糊处理(一般是均值或者高斯模糊).(这里可以加上自己的操作,做一些其他类型的模糊以及一些形态学的操作). 用原图与模糊处理之后的图像做差得到一幅图像. 判断图 ...
- otus阈值分割matlab,OSTU最佳阈值法二值化原理-matlab和C | 学步园
觉得这篇介绍OTSU方法挺清楚的.自己又加了一些,希望对初学者有帮助哦~ OTSU 1. OTSU算法原理简介 对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为w0,均值为u0,背景点 ...
- opencv学习5——大律二值化(ostu)
opencv中有多种方法进行图像的二值化,前面的3中直接设置二值化的阈值,比较粗暴无脑,而且用人眼看的话根本看不出来最佳阈值,因此人为的设置阈值是一种很不科学不严谨的方法,在opencv中ostu二值 ...
- 二值图填充原理 matlab,图像Ostu二值化原理及matlab实现代码
Ostu假设图像是由前景区域和背景区域两部分组成的,通过遍历计算不同阈值(通常为[0 255]区间范围内)下分割结果中前景区域和背景区域的灰度直方图,然后比较两者之间的方差,使得方差最大化的那个灰度阈 ...
- 大津二值化算法(Otsu)
1. 简介 我们在最灰度图做二值化时,需要设定一个分割阈值,我们并没有一个万能的阈值.而Otsu大津算法则是根据灰度图本身的信息,自动确定最佳阈值,实现以最佳阈值对灰度图进行二值化. 需要注意的是,大 ...
- 数字图像处理(四)大津二值化
题目:使用大津二值化算法进行二值化时阈值的确定. 采用国际标准测试图像Lena. 算法原理 我们在对图片进行二值化时,是希望将图片分割成两部分,称之为前景和背景.一般情况下,我们将感兴趣的部分称为前景 ...
最新文章
- 【MATLAB】矩阵运算之矩阵分解
- 安卓9全局圆角_三星S9+升级最新系统ONE UI体验,安卓9.0带来哪些惊喜?
- C#后台创建Excel文件的那点事儿
- 删除360浏览器新标签页内的热词导航
- html4符合web的标准吗,在生成HTML,表格等时,CakePhp是否“符合标准”?
- 【Python】IDE环境Pycharm运行虚拟环境Django
- 一个简单的基于 DirectShow 的播放器 2(对话框类)
- 目标追踪论文之狼吞虎咽(5):基于张量的图嵌入半监督学习及其在判别式目标追踪的应用
- 计算机截图方法,电脑7种快速截图方法,很多人都不知道!
- thinkpad电源管理解决办法 win2019
- Alien Skin Exposure v6.x 最新通用完整版汉化补丁
- 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
- mysql数据库慕课答案_智慧树MySQL数据库设计与应用慕课答案
- 二次函数回归方程_高三专题||【导数专题四】利用导数研究函数图形专项习题...
- 【最短路】Graph practice T2 drive 题解
- 100V降压图纸 电路最简单的高压降压解决方案
- Springboot+Vue实现简单的前端后分离数据交互
- python投掷骰子实验实验结论_Python 投掷骰子,并用pygal制图画出统计结果
- 【BZOJ4889】[Tjoi2017]不勤劳的图书管理员 分块+树状数组
- 什么是服务器版操作系统,服务器版操作系统是什么