基于最大类间类内方差比法的图像分割.docx
《基于最大类间类内方差比法的图像分割.docx》由会员分享,可在线阅读,更多相关《基于最大类间类内方差比法的图像分割.docx(15页珍藏版)》请在冰豆网上搜索。
基于最大类间类内方差比法的图像分割
最大类间、类内方差比法进行图像分割
一、实验目的
在理解均匀性图像分割算法的基础上,实现图像的分割,要求对灰度图像和彩色图像均进行实验,并讨论该方法对何种情况下的图像有比较好的分割效果。
二、实验要求
建议采用MATLAB软件编程实现,核心程序不准调用MATLAB的图像处理函数。
三、实验思路
1、分割的基本原理:
由于最大类间、类内方差比法是基于图像灰度分布的阈值方法。
数学模型如下:
设原图像为f(x,y),经过分割处理后的图像为g(x,y),g(x,y)为二值图像,则有
(3-1)
2、最大类间方差法与最大类间、类内方差比法的不同:
最大类间方差法又叫大津法,简称OTSU。
它是按图像的灰度特性,将图像分成背景和目标2部分。
背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大。
它只需处理类间方差,在Matlab中grathresh()即为最大类间方差函数,用来寻找阈值。
最大类间、类内方差比法是在最大类间方差法基础上的发展,在少部分教科书上可见。
它是要处理类间方差与类内方差的比值,找到满足二者比值最大时的Th,在Matlab没有此方法的工具函数。
3、本实验阈值Th的确定方法:
由于最大类间、类内方差比法图像分割的核心是阈值Th的确定,即要处理类间方差和类内方差的比值,找出最大的比值,此时满足最大比值的Th即为所求。
我们可以将所有类间、类内方差的比值放在一个矩阵中,然后使用find函数找出矩阵的最大值,对应的Th即为所求,。
4、本实验对不同图像的处理方法:
针对灰度图像,笔者打算根据如下的实验步骤进行实验仿真;对于彩色图像,笔者打算分别将原图三通道提取出来,然后按照如下的实验步骤分别对单通道分割,然后对处理后的三个通道进行整合,得到新的分割图像。
四、实验步骤
1、给定一个初始阈值Th=Th0,将图像分成C1和C2两类;
2、分别按下列公式计算两类中的方差σ1^2和σ2^2,灰度均值μ1和μ2,以及图像的总体均值μ;
灰度方差:
灰度均值:
总体均值:
3、按下式计算两类在图像中的分布概率p1和p2;
4、计算类间方差σb^2=和类内方差σin^2;
5、选择最佳阈值Th=Th*,使得图像按照该阈值分成C1和C2后,满足两者方差比最大:
6、按下式对原图的像素进行变换
5、基于MATLAB的实验仿真
1、应用于灰度图像分割代码
clearall;
closeall;
a=imread('D:
\我的图片\3.jpg');
a=rgb2gray(a);
figure;
imshow(a);
title('此为原图');
a=double(a);
[m,n]=size(a);
th=zeros(1,254);%建立一维零矩阵存放类间类内方差比的值;我们需要对灰度值从1到254遍历;
forT=1:
254
s1=0;
s2=0;
c1=0;
c2=0;
q1=0;
q2=0;
fori=1:
m
forj=1:
n
if(a(i,j)>=T)
s1=a(i,j)+s1;
c1=c1+1;
end
if(a(i,j)s2=a(i,j)+s2;
c2=c2+1;
end
end
end
u1=s1/c1;%C1的灰度均值;
u2=s2/c2;%C2的灰度均值;
p1=c1/(c1+c2);%C1的发生概率;
p2=c2/(c1+c2);%C2的发生概率;
u=(s1+s2)/(c1+c2);%样本的总体均值;
x=p1*(u-u1)*(u-u1)+p2*(u-u2)*(u-u2);%类内方差;
fori=1:
m
forj=1:
n
if(a(i,j)>=T)
q1=(a(i,j)-u1)*(a(i,j)-u1)+q1;
end
if(a(i,j)q2=(a(i,j)-u2)*(a(i,j)-u2)+q2;
end
end
end
y=p1*q1+p2*q2;%类间方差;
c=x/y;
th(T)=c;%零矩阵每个位置都存放着类间、类内方差的比值;
end
d=find(th==max(th(:
)));%寻找方差比最大时,该方差比在th矩阵中所处的位置,也就是具体的阈值T
Th=d;
b=zeros(m,n);%新建二维矩阵b用来显示分割后的图像
fori=1:
m
forj=1:
n
if(a(i,j)>=Th)
b(i,j)=255;
end
if(a(i,j)
b(i,j)=0; end end end figure; imshow(b); title(‘此为分割结果’); 2、应用于彩色图像的分割代码 clearall; closeall; X=imread('D: \我的图片\3.jpg'); figure; imshow(X); title('此为原图'); X=double(X); I=X;%建立与原图相等的矩阵I,用来将X三通道分割的结果整合再分别赋予I,作为最后的输出结果; R=X(: : 1); G=X(: : 2); B=X(: : 3); [m,n]=size(R);%R,G,B作为X三通道矩阵,肯定维度都一样; %对通道1进行分割; th1=zeros(1,254);%建立一维零矩阵存放类间类内方差比的值;我们需要对灰度值从1到254遍历; forT=1: 254 s1=0; s2=0; c1=0; c2=0; q1=0; q2=0; fori=1: m forj=1: n if(R(i,j)>=T) s1=R(i,j)+s1; c1=c1+1; end if(R(i,j)s2=R(i,j)+s2; c2=c2+1; end end end u1=s1/c1;%C1的灰度均值; u2=s2/c2;%C2的灰度均值; p1=c1/(c1+c2);%C1的发生概率; p2=c2/(c1+c2);%C2的发生概率; u=(s1+s2)/(c1+c2);%样本的总体均值; x=p1*(u-u1)*(u-u1)+p2*(u-u2)*(u-u2);%类内方差; fori=1: m forj=1: n if(R(i,j)>=T) q1=(R(i,j)-u1)*(R(i,j)-u1)+q1; end if(R(i,j)q2=(R(i,j)-u2)*(R(i,j)-u2)+q2; end end end y=p1*q1+p2*q2;%类间方差; z=x/y; th1(T)=z;%零矩阵每个位置都存放着类间、类内方差的比值; end d1=find(th1==max(th1(: )));%寻找方差比最大时,该方差比在th矩阵中所处的位置为d1,也就是具体的阈值T1 Th1=d1; fori=1: m forj=1: n if(R(i,j)>=Th1) R(i,j)=255; end if(R(i,j)R(i,j)=0; end end end %对通道2进行分割 th2=zeros(1,254); forT=1: 254 s1=0; s2=0; c1=0; c2=0; q1=0; q2=0; fori=1: m forj=1: n if(G(i,j)>=T) s1=G(i,j)+s1; c1=c1+1; end if(G(i,j)s2=G(i,j)+s2; c2=c2+1; end end end u1=s1/c1; u2=s2/c2; p1=c1/(c1+c2); p2=c2/(c1+c2); u=(s1+s2)/(c1+c2); x=p1*(u-u1)*(u-u1)+p2*(u-u2)*(u-u2); fori=1: m forj=1: n if(G(i,j)>=T) q1=(G(i,j)-u1)*(G(i,j)-u1)+q1; end if(G(i,j)q2=(G(i,j)-u2)*(G(i,j)-u2)+q2; end end end y=p1*q1+p2*q2; z=x/y; th2(T)=z; end d2=find(th2==max(th2(: ))); Th2=d2; fori=1: m forj=1: n if(G(i,j)>=Th1) G(i,j)=255; end if(G(i,j)G(i,j)=0; end end end %对通道3进行分割 th3=zeros(1,254); forT=1: 254 s1=0; s2=0; c1=0; c2=0; q1=0; q2=0; fori=1: m forj=1: n if(B(i,j)>=T) s1=B(i,j)+s1; c1=c1+1; end if(B(i,j)s2=B(i,j)+s2; c2=c2+1; end end end u1=s1/c1; u2=s2/c2; p1=c1/(c1+c2); p2=c2/(c1+c2); u=(s1+s2)/(c1+c2); x=p1*(u-u1)*(u-u1)+p2*(u-u2)*(u-u2); fori=1: m forj=1: n if(B(i,j)>=T) q1=(B(i,j)-u1)*(B(i,j)-u1)+q1; end if(B(i,j)q2=(B(i,j)-u2)*(B(i,j)-u2)+q2; end end end y=p1*q1+p2*q2; z=x/y; th3(T)=z; end d3=find(th3==max(th3(: ))); Th3=d3; fori=1: m forj=1: n if(B(i,j)>=Th3) B(i,j)=255; end if(B(i,j)B(i,j)=0; end end end I(: : 1)=R; I(: : 2)=G; I(: : 3)=B; figure; imshow(I); title('此为分割结果'); 6、实验运行示例: 原始彩色图像,亦为两个程序同一输入: 1、针对灰度图像的实验结果 2、针对原彩色图像的实验结果 对比两次试验我们发现,对于同一张彩色图片,将其按照本实验程序进行分割处理,再将原图转换为灰度图按照相同程序进行分割,二者有一定差别。 其中,后者的处理效果明显好于前者,可以看出,前者的河流部分被覆盖严重,山脉的颜色差异也没有体现出来。 故对彩色图片进行最大类间、类内差分比法分割的处理效果比灰度图片好。 七、实验结论 本实验达到了实验要求,完成了课程设计的任务。 本次课程设计我学会了很多东西。 在实验初期我还对图像分割比较模糊,对于最大类间方差法更是陌生,在我查资料后才明白最大方差法的提出背景,以及其在MATLAB图像处理中的应用。 而对于最大类间、类内方差比法更是感到力不从心,因为这个方法基本是在图书馆找不到的。 唯一出现的地方仅仅是课本上两页的论述,我才明白最大类间、类内方差比法是最大方差法基础上发展来的,是一种拓展。 好歹通过请教与摸索,我完成了这个题目的matlab程序,通过实验我明白最大类间、类内差分比法更适合处理彩色图片。 另外我希望最大类间、类内方差比法能够得到更多人的了解。 备注: 本实验程序纯笔者手动编写,经验证能在MATLAB成功仿真,仿真环境为MATLAB2014awin32,其余编译环境应该能出结果。 代码仅供参考,笔者水平有限,错误难免,还望指正!
展开阅读全文
相关搜索
|