用matlab实现自适应图像阈值分割最大类方差法代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
%用matlab实现自适应图像阈值分割最大类方差法代码clear;
warning off;
SE = strel('diamond',4);
BW1 = imread('cameraman.tif');
BW2 = imerode(BW1,SE);
BW3 = imdilate(BW2,SE);
BW4 = BW1-BW3;
%rgb转灰度
if isrgb(BW4)==1
I_gray=rgb2gray(BW4);
else
I_gray=BW4;
end
figure,imshow(I_gray);
I_double=double(I_gray);%转化为双精度
[wid,len]=size(I_gray);
colorlevel=256; %灰度级
hist=zeros(colorlevel,1);%直方图
%threshold=128; %初始阈值
%计算直方图
for i=1:wid
for j=1:len
m=I_gray(i,j)+1;
hist(m)=hist(m)+1;
end
end
hist=hist/(wid*len);%直方图归一化
miuT=0;
for m=1:colorlevel
miuT=miuT+(m-1)*hist(m);
end
xigmaB2=0;
for mindex=1:colorlevel
threshold=mindex-1;
omega1=0;
omega2=0;
for m=1:threshold-1
omega1=omega1+hist(m);
end
omega2=1-omega1;
miu1=0;
miu2=0;
for m=1:colorlevel
if m miu1=miu1+(m-1)*hist(m); else miu2=miu2+(m-1)*hist(m); end end miu1=miu1/omega1; miu2=miu2/omega2; xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2; xigma(mindex)=xigmaB21; if xigmaB21>xigmaB2 finalT=threshold; xigmaB2=xigmaB21; end end fT=finalT/255%阈值归一化 T=graythresh(I_gray)%matlab函数求阈值 for i=1:wid for J=1:len if I_double(i,j)>finalT bn(i,j)=1; else bin(i,j)=0; end end end figure,imshow(bin); figure,plot(1:colorlevel,xigma); clear; warning off; SE = strel('diamond',4); BW1 = imread('img1.bmp'); BW2 = imerode(BW1,SE); BW3 = imdilate(BW2,SE); BW4 = BW1-BW3; %rgb转灰度 if isrgb(BW4)==1 I_gray=rgb2gray(BW4); else I_gray=BW4; end figure,imshow(I_gray); I_double=double(I_gray);%转化为双精度 [wid,len]=size(I_gray); colorlevel=256; %灰度级 hist=zeros(colorlevel,1);%直方图 %threshold=128; %初始阈值 %计算直方图 for i=1:wid for j=1:len m=I_gray(i,j)+1; hist(m)=hist(m)+1; end end hist=hist/(wid*len);%直方图归一化 miuT=0; for m=1:colorlevel miuT=miuT+(m-1)*hist(m); end xigmaB2=0; for mindex=1:colorlevel threshold=mindex-1; omega1=0; omega2=0; for m=1:threshold-1 omega1=omega1+hist(m); end omega2=1-omega1; miu1=0; miu2=0; for m=1:colorlevel if m miu1=miu1+(m-1)*hist(m); else miu2=miu2+(m-1)*hist(m); end end miu1=miu1/omega1; miu2=miu2/omega2; xigmaB21=omega1*(miu1-miuT)^2+omega2*(miu2-miuT)^2; xigma(mindex)=xigmaB21; if xigmaB21>xigmaB2 finalT=threshold;