最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均

灰度记为μ,类间方差记为g。假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:

      ω0=N0/ M×N                                                         (1)

      ω1=N1/ M×N                                                         (2)

      N0+N1=M×N                                                           (3)

      ω0+ω1=1                                                            (4)

      μ=ω0μ0+ω1μ1                                                   (5)

      g=ω0(μ0-μ)2+ω1(μ1-μ)2                                        (6)

将式(5)代入式(6),得到等价公式:

g=ω0ω1(μ0-μ1)^2                                                  (7)

采用遍历的方法得到使类间方差最大的阈值T,即为所求。

由于,当图像在254或255灰度值上没有像素点时,求平均灰度时会出现0/0的情况,为避免抛出异常,可在当出现前景像素数为零时,跳出循环。

以下是c++代码(用到OpenCV):

  1. int otsuThreshold(IplImage* img)
  2. {
  3. int T = 0;//阈值
  4. int height = img->height;
  5. int width = img->width;
  6. int step = img->widthStep;
  7. int channels = img->nChannels;
  8. uchar* data = (uchar*)img->imageData;
  9. double gSum0;//第一类灰度总值
  10. double gSum1;//第二类灰度总值
  11. double N0 = 0;//前景像素数
  12. double N1 = 0;//背景像素数
  13. double u0 = 0;//前景像素平均灰度
  14. double u1 = 0;//背景像素平均灰度
  15. double w0 = 0;//前景像素点数占整幅图像的比例为ω0
  16. double w1 = 0;//背景像素点数占整幅图像的比例为ω1
  17. double u = 0;//总平均灰度
  18. double tempg = -1;//临时类间方差
  19. double g = -1;//类间方差
  20. double Histogram[256]={0};// = new double[256];//灰度直方图
  21. double N = width*height;//总像素数
  22. for(int i=0;i<height;i++)
  23. {//计算直方图
  24. for(int j=0;j<width;j++)
  25. {
  26. double temp =data[i*step + j * 3] * 0.114 + data[i*step + j * 3+1] * 0.587 + data[i*step + j * 3+2] * 0.299;
  27. temp = temp<0? 0:temp;
  28. temp = temp>255? 255:temp;
  29. Histogram[(int)temp]++;
  30. }
  31. }
  32. //计算阈值
  33. for (int i = 0;i<256;i++)
  34. {
  35. gSum0 = 0;
  36. gSum1 = 0;
  37. N0 += Histogram[i];
  38. N1 = N-N0;
  39. if(0==N1)break;//当出现前景无像素点时,跳出循环
  40. w0 = N0/N;
  41. w1 = 1-w0;
  42. for (int j = 0;j<=i;j++)
  43. {
  44. gSum0 += j*Histogram[j];
  45. }
  46. u0 = gSum0/N0;
  47. for(int k = i+1;k<256;k++)
  48. {
  49. gSum1 += k*Histogram[k];
  50. }
  51. u1 = gSum1/N1;
  52. //u = w0*u0 + w1*u1;
  53. g = w0*w1*(u0-u1)*(u0-u1);
  54. if (tempg<g)
  55. {
  56. tempg = g;
  57. T = i;
  58. }
  59. }
  60. return T;
  61. }

自适应阈值算法(大津阈值法)相关推荐

  1. OpenCV与图像处理学习七——传统图像分割之阈值法(固定阈值、自适应阈值、大津阈值)

    OpenCV与图像处理学习七--传统图像分割之阈值法(固定阈值.自适应阈值.大津阈值) 一.固定阈值图像分割 1.1 直方图双峰法 1.2 OpenCV中的固定阈值分割 二.自动阈值图像分割 2.1 ...

  2. ostu阈值分割python实现_opencv python 图像二值化/简单阈值化/大津阈值法

    1简单的阈值化 cv2.threshold第一个参数是源图像,它应该是灰度图像. 第二个参数是用于对像素值进行分类的阈值, 第三个参数是maxVal,它表示如果像素值大于(有时小于)阈值则要给出的值. ...

  3. 大津阈值法(OTSU)功能实现

    具体的公式推导参见冈萨雷斯 <数字图像处理> Otsu方法又称最大类间方差法,通过把像素分配为两类或多类,计算类间方差,当方差达到最大值时,类分割线(即灰度值)就作为图像分割阈值.Otsu ...

  4. 自适应阈值分割—大津法(OTSU算法)C++实现

    转自:https://blog.csdn.net/dcrmg/article/details/52216622 大津法是一种图像灰度自适应的阈值分割算法,是1979年由日本学者大津提出,并由他的名字命 ...

  5. C#,图像二值化(06)——全局阈值的大津算法(OTSU Thresholding)及其源代码

    1.大津算法OTSU ALGORITHM OTSU算法效果很一般. 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU, ...

  6. 具有掩膜功能的大津阈值法(Otsu)

    学习记录- 前文说到大津阈值法是一种自适应的基于全局的阈值分割算法,只有在图像直方图分布为双峰的情况下才会呈现出一种比较好的分割效果,但是待分割图像直方图分布并不是每次都是理想的结果.可能会是光照的影 ...

  7. matlab大津法函数,matlab 大津阈值分割【相关词_ 大津法阈值分割matlab】

    阈值法 阈值分割程序 Otsu Thresholding 赞(0) 踩(0) 收藏(0) 说明:大津法实现图像阈值分割的matlab源程序代码 (Otsu Thresholding Image sou ...

  8. Retinex、log对数变换、直方图均衡化区别,边缘增强Retinex算法与拉普拉斯算法联系、均衡化与亮度调节算法、大津阈值计算

    1.其中Retinex算法具有的功能:动态范围压缩(即滤掉了低频部分,提取了高频).色调再现(即还有图像色彩):具有锐化.颜色恒常性.动态范围压缩大.色彩保真度高等特点.     从算法公式上的个人理 ...

  9. Opencv中的大津阈值分割算法

    大津阈值分割算法,返回的阈值可以用于分割图像,对图像进行二值化处理.边缘检测等. 输入: Mat 类型的地址(如Otsu(&src);) 输出: 返回一个int类型的阈值. int Otsu( ...

  10. 利用阈值分割原理,对给定图像编程实现二值、反二值、截断、反截断、大津阈值、自适应阈值等类型阈值图像分割,给出实现源码和结果图像。

    程序 import cv2 import numpy as np from matplotlib import pyplot as pltimg = cv2.imread('1.jpg', 0) # ...

最新文章

  1. 2022-2028年中国互联网+不良资产处置行业深度调研及投资前景预测报告
  2. linux查看接口名,在linux下 怎么查看网络接口的名字? 网络接口的名字英文是什么呀?...
  3. Iso-Seq3|三代全长转录组分析
  4. 内核compiler.h的学习
  5. Prism区域异常问题分析(导航失效?)
  6. android firefox x86,Firefox 26桌面版加强安全 移动版支持x86
  7. Reader 与 Guava MultiReader
  8. 什么是归并排序 mergeSort
  9. Windows下Mirth连接Sybase数据库
  10. Connection: Keep-Alive
  11. 方便实用的串口调试工具/串口调试助手/串口精灵 (工具一)
  12. 国内怎么使用chatGpt
  13. Tomcat介绍及配置
  14. 37-48.产品经理入门到精通(四)
  15. Linux虚拟机不显示IP地址解决方法(亲测有效)
  16. 20170622《指导生活的算法》
  17. vive定位器突然闪红灯
  18. html中实现雪花飞舞,京东双12年终盛宴雪花飞舞3D视觉特效
  19. 牛客网 - 链表相加
  20. 图神经网络(一)图信号处理与图卷积神经网络(6)GCN实战

热门文章

  1. [精讲-3]Offline Domain Join
  2. 《Java设计模式》之桥接模式
  3. ISP QoS Lab
  4. JAVA反射系列之Field,java.lang.reflect.Field使用获取方法。
  5. disabling directory browsing
  6. linux代码、数据库备份
  7. python pca降维_机器学习的降维打击
  8. JDK8那些惊为天人的新特性
  9. 使用maven构建dubbo服务的可执行jar包
  10. ANDROID:SHOWASACTION="NEVER"是做什么用的?