基于阈值方法的大津法(OTSU算法)---图像分割

主要分为三部分去实现:
 1.基本概念
  大津法:属于阈值分割的范畴。阈值分割方法:利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合适的阈值,通过判断每一个像素点的特征属性来确定该像素点属于目标区还是背景区域,从而产生二值图像。确定一个最优阈值是分割的关键
  其确定阈值的过程为:记为前景与背景的分割阈值t.前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1;图像的总平均灰度为u=wo*u0+w1*u1:从最小到最大灰度值遍历t,当使得类间方差值a=w0*(u1-u)^2+w1*(u0-u)^2最大时,即为分割的最佳阈值。
  对大津法可作如下理解:该式实际上就是类间方差值,阈值t分割出的前景和背景两部分构成了整幅图像,而前景取值u0,概率为w0,背景取值u1,概率为w1,总均值为u
 2代码如下及其算法:
 OTSU算法步骤如下:
 ❶统计灰度级中每个像素在整幅图像中的个数
 ❷计算每个像素在整幅图像的概率分布
 ❸对灰度级进行遍历搜索,计算当前灰度值下前景背景类间概率
 ❹通过目标函数计算类内与类间方差下对应阈值 
 代码如下:(代码源自朱伟老师著书籍《opencv图像处理编程实例》)

#include <stdio.h>
#include <string>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace std;using namespace cv;
// 大津法函数实现
int OTSU(cv::Mat srcImage)//srcImage为主函数传送来的灰度图像
{    int nCols = srcImage.cols;//获取灰度图像的列数int nRows = srcImage.rows;//获取灰度图像的行数//上述两个数值相乘的结果就是像素总数    int threshold = 0;//这个参数用来返回   最终得到的最佳阈值// 初始化统计参数 int nSumPix[256];//用来存放统计灰度级中每个像素在整幅图中的个数   float nProDis[256];//用来存放每个灰度级占整个图像的概率  for (int i = 0; i < 256; i++) {       nSumPix[i] = 0;        nProDis[i] = 0;    }//将数组里面的内容赋值为0  // 统计灰度级中每个像素在整幅图像中的个数  for (int i = 0; i < nCols; i++)   //遍历列{      for (int j = 0; j < nRows; j++)//遍历行      {           nSumPix[(int)srcImage.at<uchar>(i, j)]++;//下面有此函数的详细解释      }   }// 计算每个灰度级占图像中的概率分布    for (int i = 0; i < 256; i++) {       nProDis[i] = (float)nSumPix[i] / (nCols * nRows);  //nSumPix[i]存放对应像素值的个数,(nCols * nRows)为整个图像的像素总数,nProDis[i]存放每个像素值的概率}    // 遍历灰度级[0,255],计算出最大类间方差下的阈值   float w0, w1, u0_temp, u1_temp, u0, u1, delta_temp;//w0前景点数占图像比例,w1背景点数占图像比例 //u0前景点数的平均灰度,u1背景点数的平均灰度//delta_temp总平均灰度double delta_max = 0.0;   for (int i = 0; i < 256; i++)     {       // 初始化相关参数      w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = 0;for (int j = 0; j < 256; j++)             {         //背景部分          if (j <= i) //若是像素灰度级小鱼阈值           {               // 当前i为分割阈值,第一类总的概率w0 +=nProDis[j];//相当于w0=w0+nProDis[j],满足条件的像素的概率值            不断累加,存入w0u0_temp += j * nProDis[j];//    相当于u0_temp=u0_temp +j * nProDis[j],j * nProDis[j]表示像素值与对应概率乘积  ,所有满足条件的像素值与对应概率乘积的累加和放入u0_temp  }           //前景部分              else               {                // 当前i为分割阈值,第一类总的概率  w1 += nProDis[j]; u1_temp += j * nProDis[j];            }//与前景同理    }       // 分别计算各类的平均灰度      u0 = u0_temp / w0;//下面有此语句的详细解释        u1 = u1_temp / w1;     delta_temp = (float)(w0 *w1* pow((u0 - u1), 2));//delta_temp类间方差值//下面有此语句的详细解释     // 依次找到最大类间方差下的阈值           if (delta_temp > delta_max)      {           delta_max = delta_temp;threshold = i;     }   }   return thrmaeshold;//返回最大}int main(){ // 图像读取及判断  cv::Mat srcImage = cv::imread("E:\\实验数据文件\\image\\laure.jpg");   if (!srcImage.data)     return 1;   // 灰度转换 cv::Mat srcGray;    cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);    cv::imshow("srcGray", srcGray);// 调用OTSU二值化算法得到阈值    int  ostuThreshold = OTSU(srcGray);    std::cout << ostuThreshold << std::endl;    // 定义输出结果图像 cv::Mat otsuResultImage =      cv::Mat::zeros(srcGray.rows, srcGray.cols, CV_8UC1);    // 利用得到的阈值实现二值化操作   for (int i = 0; i < srcGray.rows; i++)    {       for (int j = 0; j < srcGray.cols; j++)         {          // 满足大于阈值ostuThreshold置255          if (srcGray.at<uchar>(i, j) > ostuThreshold)otsuResultImage.at<uchar>(i, j) = 255;elseotsuResultImage.at<uchar>(i, j) = 0;       }   }   cv::imshow("otsuResultImage", otsuResultImage);cv::waitKey(0);    return 0;}

代码分析:
(1)nSumPix[(int)srcImage.at(i, j)]++:at(i, j):实现对矩阵中某个像素进行读取或者赋值。此条语句的作用举例如下:例如:某一点像素返回值是整数6,那么对应nSumPix[6]里面的值加一(初始值为0),如果整幅图像素值为6的像素点有8个,那么最终的结果是nSumPix[7]里的值为8
(2)u0 = u0_temp / w0 ,如下图解释

(3)delta_temp = (float)(w0 w1 pow((u0 - u1), 2)); 

3.结果显示
上原图,下结果图。

基于阈值方法的大津法(OTSU算法)---图像分割相关推荐

  1. otsu阈值分割算法原理_大津法---OTSU算法

    简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景 ...

  2. 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)

    目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...

  3. 【智能车】图像二值化算法--大津法OTSU

    图像二值化算法–大津法OTSU 大津算法是一种图像二值化算法,作用是确定将图像分成黑白两个部分的阈值. 大津法是针对灰度值进行阈值分割二值化,如果是彩色图像的话需要先转化成灰度图再进行计算. 方差越大 ...

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

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

  5. 图像阈值分割:大津法(Otsu)

    大津法(OTSU法)是由大津于1979 年提出的,对图像I,记T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0:背景点数占图像比例为w1,平均灰度为u1.从最小灰度值到最大灰度值遍历 ...

  6. 最大类间方差法(大津法OTSU)原理

    算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...

  7. 图像分割之大津法Otsu

    中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...

  8. 算法001:大津法OTSU学习记录

    OTSU算法 一.大津法主要的工作是什么? 大多数时候,我们需要获取到一幅图像中的特定目标.如果可以根据像素值将图像进行合理的分割,例如全局阈值分割那样,找到一个阈值TTT,大于阈值TTT的赋予一个像 ...

  9. 图像分割——大津法(Otsu)

    大津法又叫最大类间方差法,是于1979年由日本学者大津展之提出的一种对图像进行二值化的高效算法,是在判别与最小二乘法原理的基础上推导出来的. 算法原理 把直方图在某一阈值处分割为两组,当前分成的两组间 ...

最新文章

  1. Linux中的输入输出管理
  2. 北京清华长庚医院与数据院签约,医工结合促医疗大健康发展
  3. 【PC工具】更新免费文库文档下载器,破解文库下载器,免费下载文库文档
  4. 《Too Much Heaven》
  5. linux安装软件方法汇总
  6. 灵活应对算法大赛新挑战,极清晰比赛思路你值得拥有
  7. 点击按钮抓不到页面的参数
  8. OEA框架 2.9 Pre-Alpha 源码公布
  9. 3月4日 投影变换、仿射、Cross Ratios交比与单目测距、投影变换代码实现logo与球筐融合
  10. MATLAB 2017a 下载及安装
  11. JAVA对接飞猪旅行_飞猪对接教程
  12. 阅读不懂,图书之过——《大话设计模式》创作历程 (转载)
  13. 离散型均匀分布 连续型均匀分布
  14. Echarts 鼠标hover时柱状图设置背景色
  15. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法
  16. MER:综述高通量测序应用于病原体和害虫诊断
  17. VCSA Exception in invoking authentication handler User password expired
  18. 计算机考试照片在线处理,全国普通计算机等级考试照片尺寸 在线调整的方法...
  19. 【SpringBoot】SpringBoot 整合 MyBatis
  20. 二分查找(普通、找第一个、找最后一个)

热门文章

  1. Epson机器人程序执行相关命令2
  2. (KA)*(KA的伴随)
  3. 如何解决win11没有管理员权限等问题如何解决
  4. vue中的属性方法computed与methods的区别
  5. 东华大学2020考研计算机复试准备上机题解析答案_进阶篇(31-60)
  6. 北京大学 计算机在哪个学院,中国计算机专业最好的大学是哪几个?清华北大哪个最好?...
  7. VisualSVN的安装
  8. Allegro 172版本自动放置层叠
  9. 一卡通android文档,基于Android平台的校园一卡通的设计
  10. 项目文档word格式规范