最大类间方差法(大津法,OTSU)
来源:互联网 发布:淘宝宝贝发布最佳时间 编辑:程序博客网 时间:2024/05/12 09:02
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。对于图像I(x,y),前景(即目标)和背景的分割阈值记作,属于前景的像素点数占整幅图像的比例记为,其平均灰度;背景像素点数占整幅图像的比例为,其平均灰度为。图像的总平均灰度记为,类间方差记为。
假设图像的背景较暗,并且图像的大小为,图像中像素的灰度值小于阈值的像素个数记作,像素灰度大于阈值的像素个数记作,则有:
采用遍历的方法得到使类间方差最大的阈值,即为所求。
代码区
- OpenCV代码:
- int myOtsu(const IplImage *frame) //大津法求阈值
- {
- #define GrayScale 256 //frame灰度级
- int width = frame->width;
- int height = frame->height;
- int pixelCount[GrayScale]={0};
- float pixelPro[GrayScale]={0};
- int i, j, pixelSum = width * height, threshold = 0;
- uchar* data = (uchar*)frame->imageData;
- //统计每个灰度级中像素的个数
- for(i = 0; i < height; i++)
- {
- for(j = 0;j < width;j++)
- {
- pixelCount[(int)data[i * width + j]]++;
- }
- }
- //计算每个灰度级的像素数目占整幅图像的比例
- for(i = 0; i < GrayScale; i++)
- {
- pixelPro[i] = (float)pixelCount[i] / pixelSum;
- }
- //遍历灰度级[0,255],寻找合适的threshold
- float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0;
- for(i = 0; i < GrayScale; i++)
- {
- w0 = w1 = u0tmp = u1tmp = u0 = u1 = deltaTmp = 0;
- for(j = 0; j < GrayScale; j++)
- {
- if(j <= i) //背景部分
- {
- w0 += pixelPro[j];
- u0tmp += j * pixelPro[j];
- }
- else //前景部分
- {
- w1 += pixelPro[j];
- u1tmp += j * pixelPro[j];
- }
- }
- u0 = u0tmp / w0;
- u1 = u1tmp / w1;
- deltaTmp = (float)(w0 *w1* pow((u0 - u1), 2)) ;
- if(deltaTmp > deltaMax)
- {
- deltaMax = deltaTmp;
- threshold = i;
- }
- }
- return threshold;
- }
- MATLAB 代码1
- function binariedImage=OSTU(scoreImage)
- scoreImage=double(scoreImage);
- [height,length]=size(scoreImage);
- totalPixel=height*length;
- % maxPixNumber=max(max(scoreImage));
- % 这个地方为了以后计算方便 就不这样计算了 而是默认最大的为255
- pixelCount=zeros(1,256);%统计各个像素值的个数
- % 0-256
- for i=1:length
- for j=1:height
- number=scoreImage(j,i)+1;
- pixelCount(number)=pixelCount(number)+1;
- end
- end
- %概率
- pf=pixelCount/totalPixel;
- %前向累计概率密度函数
- cpf=zeros(1,256);
- cpf(1)=pf(1);
- for i=2:256
- cpf(i)=cpf(i-1)+pf(i);
- end
- %后向累计概率密度函数
- bpf=zeros(1,256);
- bpf(256)=pf(256);
- for j=256:-1:2
- bpf(j-1)=bpf(j)+pf(j-1);
- end
- %前向累计期望
- meanForward=zeros(1,256);
- meanForward(1)=1;
- for i=2:256
- meanForward(i)=meanForward(i-1)*(cpf(i-1)/cpf(i))+(pf(i)/cpf(i))*i;
- end
- %后向累计期望
- meanBack=zeros(1,256);
- meanBack(max(max(scoreImage)))=max(max(scoreImage));
- for i=max(max(scoreImage)):-1:2
- meanBack(i-1)=meanBack(i)*(bpf(i)/bpf(i-1))+(pf(i-1)/bpf(i-1))*(i-1);
- end
- delta=cpf.*bpf.*(meanForward-meanBack).^2;
- [value,index]=max(delta);
- % 返回的是逻辑的图像
- binariedImage=scoreImage>index;
- MATLAB 代码2
- function binariedImage=OSTU(scoreImage)
- [height,length]=size(scoreImage);
- totalNum=height*length;
- pixelCount=zeros(1,256);%统计各个像素值的个数
- for i=1:length
- for j=1:height
- number=scoreImage(j,i)+1;
- pixelCount(number)=pixelCount(number)+1;
- end
- end
- pf=pixelCount/totalNum;
- deltaMax=0;
- a=1:256;
- maxmax=max(max(scoreImage));
- for i=1:maxmax
- w1=sum(pf(1:i));
- w2=1-w1;
- mean1=sum(pf(1:i).*a(1:i))/sum(pf(1:i));
- mean2=sum(pf(i+1:maxmax).*a(i+1:maxmax))/sum(pf(i+1:maxmax));
- delta=w1*w2*(mean1-mean2)^2;
- if delta>deltaMax
- deltaMax=delta;
- threshold=i;
- end
- end
- % 返回的是逻辑的图像
- binariedImage=scoreImage>threshold;
阅读全文
0 0
- 最大类间方差法(大津法,OTSU)
- 最大类间方差法(大津法OTSU)
- 最大类间方差法(大津法,OTSU)
- 最大类间方差法(大津法,OTSU)
- 最大类间方差法(OTSU)
- 最大类间方差法(OTSU)
- 最大类间方差法(OTSU)
- 最大类间方差法(OTSU)
- 最大类间方差法(OTSU)
- Otsu最大类间方差法
- 最大类间方差法----Otsu
- 最大类间方差法(大津法OTSU)
- 最大类间方差法(大津法OTSU)
- 最大类间方差法(大津法OTSU)
- Otsu's method大津法/最大类间方差(Otsu)
- Otsu's method大津法/最大类间方差(Otsu)
- Otsu's method大津法/最大类间方差(Otsu)
- opencv 最大类间方差(大津法OTSU)
- Windows端部署Scala2.10.5开发环境
- Android学习 ——SystemUIService之SettingsUI分析
- java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类HashMap Hashtable LinkedHashMap 和TreeMap.
- vx使用时路由传参问题
- Error:No such property: zipAlignEnabled for class: com.android.build.gradle.internal.variant.Applica
- 最大类间方差法(大津法,OTSU)
- 《HTTP权威指南》学习笔记(8)第8章 集成点:网关、隧道及中继(关键词:计算机网络/HTTP/网关/隧道/中继)
- Mac OSX python 安装pandas numpy scrapy的问题
- 英文智能问答之OpenEphyra
- deep learning 专项课程二 第一单元选择题
- 用VC写DLL中"error LNK2005: _DllMain@12 already defined"的错误
- 二叉树 前序+中序->恢复二叉树后序
- Test
- 指针数组和二级指针