OSTU 最佳全局阈值处理-最大类间方差法
/****************************************以下部分内容为转载**********************************************/
/*****转自:http://hi.baidu.com/yibobin/blog/item/252573b76fba72f831add1a9.html******/
最大类间方差法是由日本学者大津于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,即为所求。
Otsu算法步骤如下:
设图象包含L个灰度级(0,1…,L-1),灰度值为i的的象素点数为Ni ,图象总的象素点数为N=N0+N1+...+N(L-1)。灰度值为i的点的概为:
P(i) = N(i)/N.
门限t将整幅图象分为暗区c1和亮区c2两类,则类间方差σ是t的函数:
σ=a1*a2(u1-u2)^2 (2)
式中,aj 为类cj的面积与图象总面积之比,a1 = sum(P(i)) i->t, a2 = 1-a1; uj为类cj的均值,u1 = sum(i*P(i))/a1 0->t,
u2 = sum(i*P(i))/a2, t+1->L-1
该法选择最佳门限t^ 使类间方差最大,即:令Δu=u1-u2,σb = max{a1(t)*a2(t)Δu^2}
/****************************************以下部分内容为原创;OTSU代码**********************************************/
首先是自己实现的OTSU,原来不知道MATLAB直接有就自己编了……崩溃啊!
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %OTSU 最大类间方差法图像分类
- %该方法将图像分为前景和背景两部分,背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,
- %当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
- %Command 中调用方式: OTSU('D:\Images\pic_loc\1870405130305041503.jpg')
- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- function th=thresh_md(a);
- x=imread(a);
- a=rgb2gray(x);
- subplot(211);
- imshow(a,[]);
- %[count x]=imhist(a);
- [m,n]=size(a);
- N=m*n;
- L=256;
- for i=1:L
- count(i)=length(find(a==(i-1)));
- f(i)=count(i)/(N);
- end
- for i=1:L
- if count(i)~=0
- st=i-1;
- break;
- end
- end
- for i=L:-1:1
- if count(i)~=0
- nd=i-1;
- break;
- end
- end
- %f=count(st+1:nd+1); %f是每个灰度出现的概率
- p=st; q=nd-st;
- u=0;
- for i=1:q
- u=u+f(i)*(p+i-1); %u是像素的平均值
- ua(i)=u; %ua(i)是前i个像素的平均灰度值
- end;
- for i=1:q
- w(i)=sum(f(1:i)); %w(i)是前i个像素的累加概率
- end;
- w=w+0.0001;
- d=(u*w-ua).^2./(w.*(1-w));
- [y,tp]=max(d); %可以取出数组的最大值及取最大值的点
- th=tp+p;
- for i=1:m
- for j=1:n
- if a(i,j)>th
- a(i,j)=0;
- else
- a(i,j)=255;
- end
- end
- end
- subplot(212);
- imshow(a,[]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%OTSU 最大类间方差法图像分类
%该方法将图像分为前景和背景两部分,背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,
%当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
%Command 中调用方式: OTSU('D:\Images\pic_loc\1870405130305041503.jpg')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function th=thresh_md(a); x=imread(a); a=rgb2gray(x); subplot(211);imshow(a,[]);%[count x]=imhist(a); [m,n]=size(a); N=m*n; L=256; for i=1:Lcount(i)=length(find(a==(i-1)));f(i)=count(i)/(N);
endfor i=1:L if count(i)~=0 st=i-1; break; end
end
for i=L:-1:1 if count(i)~=0 nd=i-1; break; end
end
%f=count(st+1:nd+1); %f是每个灰度出现的概率
p=st; q=nd-st;
u=0;
for i=1:q u=u+f(i)*(p+i-1); %u是像素的平均值 ua(i)=u; %ua(i)是前i个像素的平均灰度值
end; for i=1:q w(i)=sum(f(1:i)); %w(i)是前i个像素的累加概率
end; w=w+0.0001;d=(u*w-ua).^2./(w.*(1-w));
[y,tp]=max(d); %可以取出数组的最大值及取最大值的点
th=tp+p; for i=1:m for j=1:n if a(i,j)>th a(i,j)=0; else a(i,j)=255; end end
end
subplot(212);
imshow(a,[]);
下面直接调用MATLAB的函数:
- I=imread('D:\Images\pic_loc\1870405130305041503.jpg');
- a=rgb2gray(I);
- level = graythresh(a);
- a=im2bw(a,level);
- imshow(a,[]);
I=imread('D:\Images\pic_loc\1870405130305041503.jpg');
a=rgb2gray(I);
level = graythresh(a);
a=im2bw(a,level);
imshow(a,[]);
实验结果:
OSTU 最佳全局阈值处理-最大类间方差法相关推荐
- 图像分割 - 阈值处理 - 最大类间方差法(OTSU)
目录 1. OTSU 介绍 2. 代码实现 1. OTSU 介绍 OTSU 大津法,也是最大类间方差算法 OTSU 算法的思想通过不同的阈值K,将图像的分为两个区域,一个是灰度值 0 <= k ...
- 【机器视觉学习笔记】大津法/Otsu最大类间方差法 最佳阈值处理(C++)
目录 概念 C++源码 OtsuThreshold 主函数 效果 完整源码 平台:Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文所用源码修改自C+ ...
- Ostu最大类间方差法的C++实现
一.Ostu的原理 最大类间方差法是由日本学者大津(Nobuyuki Ostu)在1979年提出的,该方法根据计算公式自动计算分割单域值,是一种根据灰度图像自动计算阈值的方法.它按照灰度图像的灰度值等 ...
- 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)
文章目录 一.实验目的 二.实验原理 (一) 阈值分割 1. 直方图法 2.OTSU法(最大类间方差法)确定阈值 3. 迭代阈值法 4. 点检测 (二)边缘检测 三.实验内容 (一)阈值分割 1. 直 ...
- 最大类间方差法(大津法OTSU)原理
算法介绍 最大类间方差法是1979年由日本学者大津提出的,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分.当取最 ...
- CUDA精进之路(五):图像处理——OTSU二值算法(最大类间方差法、大津法)
引言 最近在做医疗设备相关的项目,故在项目中大量用到了各类图像分割的算法,为了在图像中分割出特定目标,用到的算法可以有很多,比如阈值分割,多通道分割,边缘分割以及一些前沿的组合分割.而对大多数图像来说 ...
- 基于OTSU最大类间方差法的ROI分割、提取图像中的形状特征--面积、周长、离心率、zernike矩
分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的) 把这个过程拆分几个部分共同学习一下吧 1.Otsu法原理 最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度 ...
- 基于遗传算法的二维最大类间方差法的图像分割优化
一.背景 最大类间方差阈值分割法日本大津展之在1980年提出的,其基本思路是将图像的直方图以某一灰度为阈值,将图像分成两组并计算两组的方差,当被分成的两组之间的方差最大时,就以这个灰度值为國值分割图像 ...
- 图像二值化之最大类间方差法(大津法,OTSU)
参考文章1:图像二值化与otsu算法介绍 参考文章2:python opencv cv2.threshold() (将固定级别的阈值应用于每个数组元素)ThresholdTypes 最大类间方差法(大 ...
- opencv与C++实现最大类间方差法(OTSU)进行图像二值化
直接上代码,使用最大类间方差法进行二值化的函数 void threshold_otsu(Mat &mat, Mat &mat_thresh) //mat为输入图像,mat_thresh ...
最新文章
- JAVA Functions in XI(转)
- 终于“打造”出了一个可以随时随地编程的工具
- python画直方图成绩分析-使用Python进行描述性统计
- (笔试题)小米Git
- 字节码编辑器JClassLIb下载教程
- Mask-RCNN中的ROIAlign, ROIPooling及ROIWarp对比
- 审稿意见说我引言和结论写的毫无差别!
- 移动端图片上传后进行压缩功能
- JBoss-4.2.3.GA下发布EJB3项目遇到的问题之JSF篇
- python编写代码实现文件的拷贝功能_如何使用Python脚本实现文件拷贝
- 访问win10的远程桌面(Remote Desktop)总是凭据或者用户密码错误
- Android+8.0+微信表情,微信8.0表情为什么不动?微信8.0哪些表情有动画效果?
- 电脑键盘快捷键使用大全
- “00后”消费数据分析,一文教你撩动“00后”购物欲
- 机器学习.周志华《15 规则学习 》
- package.json文件指南
- 微信小程序在线成语接龙答题有奖1.5.1版源码
- Android12,SCHEDULE_EXACT_ALARM权限检查值一直返回true
- 电脑——如何配置一台电脑
- 是对计算机系统或其他网络设备进行,计算机信息系统是由计算机及其相关的和配套的设备、设施(含网络)构成的,按照一定的应用目标和规则对信息进行()等处理的人机系统。...
热门文章
- 3D打印行业入行总结
- 计算机键盘芯片,电脑键盘芯片详解中文.pdf
- 局域网打印机怎么连接_苹果手机怎么连打印机?苹果系统怎么连接网络打印机?一看就会...
- tpac100控制器设置教程_AC100基站控制器配置说明
- 阿里云服务器如何登录?阿里云服务器的三种登录方法
- 支持傲腾技术的服务器主板,G4560可以用傲腾内存么
- 测开面试题大全及答案(含测试基础|实例介绍|软件本地化测试等)
- 一个放在口袋里的项目,将社交裂变做到了极致
- 01背包与完全背包详解
- petalinux 建立工程两种方式