题目:使用大津二值化算法进行二值化时阈值的确定。
采用国际标准测试图像Lena。

算法原理

我们在对图片进行二值化时,是希望将图片分割成两部分,称之为前景和背景。一般情况下,我们将感兴趣的部分称为前景,对于不感兴趣的称为背景。
大津算法的原理是:对图片二值化后,产生的前景和背景之间差异是比较大的,而前景部分中的像素是相似的,背景部分中的像素是相似的;可以理解为,同一类中差异小,不同类中差异大。那么如果存在一个阈值,使得图像分为了前景和背景,应当符合同一类中差异最小,不同类中差异最大,这个值就是最佳阈值。
“差异”用方差来表示:如果单个的数据其越偏离于中心,其方差也就越大。如果同一类中方差越小,那么表示同一类中差异也小;不同类之间方差越大,表示不同类中差异越大。

假设图像宽为www,高为hhh,灰度阈值为t,0≤t≤255t,0\le t\le255t,0≤t≤255。
像素值小于ttt的像素个数为n0n_0n0​(即前景),像素值大于等于ttt的像素个数为n1n_1n1​(即背景)。所以有公式:n0+n1=像素总个数=h×wn_0+n_1=像素总个数=h\times wn0​+n1​=像素总个数=h×w
前景像素个数n0n_0n0​占像素总数的比例w0w_0w0​:w0=n0/(h×w)w_0=n_0/(h\times w)w0​=n0​/(h×w)
背景像素个数n1n_1n1​占像素总数的比例w1w_1w1​:w1=n1/(h×w)w_1=n_1/(h\times w)w1​=n1​/(h×w)
前景的平均灰度u0u_0u0​为前景的灰度和除以前景的像素个数n0n_0n0​:u0=前景的灰度和/n0u_0=前景的灰度和/n_0u0​=前景的灰度和/n0​
背景的平均灰度u1u_1u1​为背景的灰度和除以背景的像素个数n1n_1n1​:u1=背景的灰度和/n1u_1=背景的灰度和/n_1u1​=背景的灰度和/n1​
那么全图的平均灰度uuu为:u=(前景灰度和+背景灰度和)/(h×w)=w0×u0+w1×u1u=(前景灰度和+背景灰度和)/(h\times w)=w_0\times u_0+w_1\times u_1u=(前景灰度和+背景灰度和)/(h×w)=w0​×u0​+w1​×u1​
类间方差ggg:g=w0×(u−u0)2+w1×(u−u1)2g=w_0\times (u-u_0)^2+w_1\times (u-u_1)^2g=w0​×(u−u0​)2+w1​×(u−u1​)2
进一步推导:g=w0×w1×(u0−u1)2g=w_0\times w_1\times (u_0-u_1)^2g=w0​×w1​×(u0​−u1​)2
当ggg最大时,此时对应的ttt就为最佳阈值。
C++代码:

    cv::Mat image = cv::imread("Lena.bmp");cv::Mat src(image.size(), CV_8UC1);cv::Mat dst(image.size(), CV_8UC1);cv::cvtColor(image, src, CV_BGR2GRAY);int width = src.cols;int height = src.rows;vector<float>g;for (int t = 0; t < 256; t++){double n0 = 0, n1 = 0;float w0 = 0, w1 = 0, u0 = 0, u1 = 0;for (int row = 0; row < height; row++){uchar *currentData = src.ptr<uchar>(row);for (int col = 0; col < width; col++){if (*(currentData + col) < t){n0 += 1;u0 = u0 + *(currentData + col);}else{n1 += 1;u1 = u1 + *(currentData + col);}}}w0 = n0 / (width*height);w1 = n1 / (width*height);u0 = u0 / n0;u1 = u1 / n1;if (n0 == 0){u0 = 0;}if (n1 == 0){u1 = 0;}g.push_back(w0*w1*pow(u0 - u1, 2));}//最大值 int maxValue=*max_element(g.begin(),g.end())int thre = max_element(g.begin(), g.end()) - g.begin();cout << "阈值是" << thre << endl;

最终得出的阈值是118。
结果展示:

代码里有一点要注意的是:我们创建vector来保存不同阈值t下对应的g,最终遍历完所有的阈值t,需要求出vector g中的最大值的下标,此下标就是我们想要的最佳阈值t。我们使用max_element函数,得出最大值的地址,然后减去开始的地址得到的就是最大值的下标。

参考博客:https://blog.csdn.net/qq_40243750/article/details/117433179
https://zhuanlan.zhihu.com/p/95034826
https://blog.csdn.net/Song_Esther/article/details/86087655?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-86087655-blog-67638545.pc_relevant_multi_platform_whitelistv3&spm=1001.2101.3001.4242.1&utm_relevant_index=3

数字图像处理(四)大津二值化相关推荐

  1. C++实现大津二值化算法

    文章目录 一.大津算法 二.原理 三.算法实现步骤 四.测试结果 五.完整代码 一.大津算法 大津算法(Ostu)也称最大类间方差法.顾名思义,就使两个类别之间某个属性的方差最大的方法.在图像处理中, ...

  2. otsu阈值分割算法原理_大津二值化算法OTSU的理解

    otsu 大津算法介绍: OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法. 利用阈值将原图像分成前景,背景两个图象. 前景:用n1,csum,m1来表示在当前阈值下的 ...

  3. 大津二值化算法 ( Otsu's binarization ) 自动确定二值化图像时的阈值

    大津算法,也被称作最大类间方差法,是一种自动确定二值化阈值的算法. 在这里作者不介绍算法推导的过程,算法推导过程网络上有许多介绍,这里只给出算法最终推导出的结论: 使得左侧 的值最大,就可以得到最好的 ...

  4. 大津二值化算法(Otsu)

    1. 简介 我们在最灰度图做二值化时,需要设定一个分割阈值,我们并没有一个万能的阈值.而Otsu大津算法则是根据灰度图本身的信息,自动确定最佳阈值,实现以最佳阈值对灰度图进行二值化. 需要注意的是,大 ...

  5. 数字图像处理100问—03二值化(Thresholding)

    提示:内容整理自:https://github.com/gzr2017/ImageProcessing100Wen CV小白从0开始学数字图像处理 03二值化(Thresholding) 把图像进行二 ...

  6. FPGA|数字图像处理实现口罩识别——二值化

    [写在前面]刚入门小菜鸟,记录一下口罩识别学习过程.参考文件和网址会在文末注明.有错误欢迎指出,也欢迎进行补充~ 原理图如下,二值化对应为红框里的部分 使用的二值化方法是手动指定一个阈值,通过阈值来进 ...

  7. Java图像处理:灰度、二值化、浮雕、去色、反向、怀旧、放大镜等

    图像是由一个个像素点组合而成,图像处理本身实际上是遍历图像的像素点,对像素点的RGB值进行更改,以达到图像处理的目的. 接下来,我们主要介绍一下图片转化为二维像素点数组的方法以及部分图像处理如灰度.二 ...

  8. 【图像处理】——图像的二值化操作及阈值化操作(固定阈值法(全局阈值法——大津法OTSU和三角法TRIANGLE)和自适应阈值法(局部阈值法——均值和高斯法))

    目录 一.二值化的概念(实际上就是一个阈值化操作) 1.概念: 2.实现方法 3.常用方法 二.阈值类型 1.常见阈值类型(主要有五种类型) (1)公式描述 (2)图表描述 2.两种特殊的阈值算法(O ...

  9. ZYNQ图像处理(4)——灰度图像转二值化图像

    1.二值化图像简介 前面已经完成了摄像头图像的采集和显示,以及RGB图像转灰度图.二值化图像在图像处理领域同样有广泛的应用,本节介绍如何用FPGA实现灰度转二值化图形.灰度实现二值化的原理很简单,只需 ...

最新文章

  1. Redis安装与卸载
  2. linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO
  3. 【NLP】情感分析:BERT vs Catboost
  4. 一步步学习微软InfoPath2010和SP2010--第十四章节--高级选项(3)--重新链接表单
  5. 数据结构题:由逆置数组方法——逆置线性表L的所有元素
  6. mysql注入攻击实_三十三、MySQL基础系列笔记之MySQL安全问题与SQL注入攻击
  7. Codeforces Round #602 (Div. 2) D2. Optimal Subsequences stl 黑科技
  8. Fake Maxpooling(2020多校第二场F)
  9. powershell 停止正在运行的用户应用
  10. Linux必学的60个命令【转载】
  11. python标准数据类型复习
  12. 高校学生管理系统(课设毕设有源码)
  13. pycharm的python解释器选择_pycharm中配置python解释器
  14. Linux工具篇 | Ubuntu安装balenaEtcher镜像刻录工具
  15. PowerDesigner 下载安装
  16. Markdown编辑器-初始模板参考
  17. 第十四期公关大讲堂:公关稿件写作理念、方法与技巧.
  18. Unity3D---通过Shader实现美颜
  19. 【训练题27:单调队列实现RMQ(附带详细说明)】 H :圣诞糖果 | 吉首大学第十届“新星杯”
  20. 在Python中调用C/C++:cython及pybind11

热门文章

  1. SSM Activiti6.0 java项目框架 spring5 工作流引擎 审批流程
  2. 亚马逊卖家如何做好视频营销来提高销量
  3. 阅读笔记5:神经支持决策树(可解释性)
  4. JQuery写农场的小游戏
  5. 创建jira plugin插件、创建jira实例生成jar包总结
  6. 【Vulnhub】DC-4
  7. PS绘制Android圆角图标
  8. 用txt阅读器按目录分章节阅读小说
  9. BtoB BtoC CtoC
  10. 双向循环链表增、删、改、查