阈值分割
2015-09-01 12:05
316 查看
一、迭代法
通过迭代法来求出分割的最佳阈值,具有一定的自适应性,这种方法适用于物体的和背景有较大的区分,即其直方图有相当清楚的波谷;
具体算法步骤如下:
1.为全局阈值选择一个初始估计值T。
2.用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
3.计算G1和G2像素的平均灰度值m1和m2;
4.计算一个新的阈值:T = (m1 + m2) / 2;
5.重复步骤2和4,直到连续迭代中的T值间的差小于一个预定义参数为止。
实现代码:
实验证明,该方法只适用于,直方图有明显波谷的情况,其他情况不理想;
二、Ostu阈值分割法(最大类间方差法)
(1)基本原理:利用最佳阈值,将图像的灰度分割成两部分,使得两部分之间的方差最大,具有最大分离性;
(2)原理解释:当背景类信息被错误的分为目标类信息,或目标类信息被错误的分为背景类信息时,都会导致目标和背景之间的差别变小。正是由于这一特性,只要使类间方差最大或类内方差最小,这样的分割就意味着最小的误差,并且根据该准则选取最佳阈值使得目标和背景之间的分离性最好。
(3)优缺点:该方法的优点是运算量不大,在一定条件下受图像对比度与亮度变化的影响很小,在一些实时图像处理系统中得到了很广泛的应用。缺点是该方法只是借助了图像的像素灰度信息,并未考虑像素间的空间相关信息(如邻域信息),加之外部干扰的存在,使得灰度直方图的波峰和波谷并不一定明显,因而不能得到满意的分割效果,抗干扰性较差。
(4)基本步骤:
计算输入图像的归一化直方图
计算累积和P1(k);
计算累积均值m(k);
计算全局灰度均值mG;
计算类间方差;类间方差=[(mG*P1(k)-m(k))^2]/[P1(k)*(1-P1(k))];
得到最佳阈值,即使得类间方差最大的k值;如果最大值不唯一,则检测到各个最大值k的平均值
在最优阈值处计算可分性度量;可分性度量=最大类间方差/全局方差;全局方差=sum((i-mG)^2*p(i))
(5)下面的代码为graythresh函数里面的实现部分,也可以直接利用该函数;其中T为最优阈值,SM为可分性度量
三、用图像平滑改善全局阈值处理
由于受到噪声的干扰,上述方法在处理图像时,会不理想,最好是先进行平滑去噪,然后在进行阈值分割
通过迭代法来求出分割的最佳阈值,具有一定的自适应性,这种方法适用于物体的和背景有较大的区分,即其直方图有相当清楚的波谷;
具体算法步骤如下:
1.为全局阈值选择一个初始估计值T。
2.用T分割图像。产生两组像素:G1有灰度值大于T的像素组成,G2有小于等于T像素组成。
3.计算G1和G2像素的平均灰度值m1和m2;
4.计算一个新的阈值:T = (m1 + m2) / 2;
5.重复步骤2和4,直到连续迭代中的T值间的差小于一个预定义参数为止。
实现代码:
clear; clc; close all; I=imread('Fig1013(a).tif'); T=0.01; I=im2double(I); % T1=(min(I(:))+max(I(:)))/2; T1=mean2(I); index=find(I<T1); index2=find(I>=T1); T2=(mean2(I(index))+mean2(I(index2)))/2; count=0; while abs(T2-T1)>T T1=T2; index=find(I<T1); index2=find(I>=T1); T2=(mean2(I(index))+mean2(I(index2)))/2; count=count+1; end count T2 figure,imhist(I) figure,imshow(I) I2=im2bw(I,T2); figure,imshow(I2);
实验证明,该方法只适用于,直方图有明显波谷的情况,其他情况不理想;
二、Ostu阈值分割法(最大类间方差法)
(1)基本原理:利用最佳阈值,将图像的灰度分割成两部分,使得两部分之间的方差最大,具有最大分离性;
(2)原理解释:当背景类信息被错误的分为目标类信息,或目标类信息被错误的分为背景类信息时,都会导致目标和背景之间的差别变小。正是由于这一特性,只要使类间方差最大或类内方差最小,这样的分割就意味着最小的误差,并且根据该准则选取最佳阈值使得目标和背景之间的分离性最好。
(3)优缺点:该方法的优点是运算量不大,在一定条件下受图像对比度与亮度变化的影响很小,在一些实时图像处理系统中得到了很广泛的应用。缺点是该方法只是借助了图像的像素灰度信息,并未考虑像素间的空间相关信息(如邻域信息),加之外部干扰的存在,使得灰度直方图的波峰和波谷并不一定明显,因而不能得到满意的分割效果,抗干扰性较差。
(4)基本步骤:
计算输入图像的归一化直方图
计算累积和P1(k);
计算累积均值m(k);
计算全局灰度均值mG;
计算类间方差;类间方差=[(mG*P1(k)-m(k))^2]/[P1(k)*(1-P1(k))];
得到最佳阈值,即使得类间方差最大的k值;如果最大值不唯一,则检测到各个最大值k的平均值
在最优阈值处计算可分性度量;可分性度量=最大类间方差/全局方差;全局方差=sum((i-mG)^2*p(i))
(5)下面的代码为graythresh函数里面的实现部分,也可以直接利用该函数;其中T为最优阈值,SM为可分性度量
clear; clc; I=imread('1.tif'); %计算直方图 h=imhist(I); %归一化 h=h/sum(h); %累积分布概率 P1=cumsum(h); i=(1:numel(h))'; %直到灰度级k的均值 m=cumsum(i.*h); %全局均值 mG=m(end); %类间方差,加eps防止除数为零 sigma=((mG*P1-m).^2)./(P1.*(1-P1)+eps); %最大的类间方差 sigmaMax=max(sigma); %假设最大不止一个取均值 T=mean(find(sigma==sigmaMax)); %最优阈值归一化,减一是因为图像的索引是0-255,但是matlab索引是1-256 T=(T-1)/(numel(h)-1) %可分性度量 SM=sigmaMax/(sum(((i-mG).^2).*h)+eps);
三、用图像平滑改善全局阈值处理
由于受到噪声的干扰,上述方法在处理图像时,会不理想,最好是先进行平滑去噪,然后在进行阈值分割
相关文章推荐
- RDD.scala源码
- Android framework系统默认设置修改
- 二分图带权最大独立集
- python2.7学习笔记(7) ——函数式编程
- git的使用介绍
- Just a Numble HDU杭电2117
- CentOS安装配置VSFTP服务器
- SSH框架Action向页面传值差异
- Mysql主从复制与读写分离闲谈
- 利用C语言进行urldecode,解决浏览器中的urlencode
- A1 = ? HDU 杭电2086 【数学】
- Oracle GoldenGate 三、加密
- TortoiseSVN常用操作指南
- Cocos2d-x中Vector容器以及实例介绍
- 软件测试学习随记
- Mac下git的安装与配置
- 24个设计模式学习
- rotate.js实现图片旋转 (chrome,IE,firefox都可以实现)
- 商城后台编辑栏目
- 多线程(1)