基于matlab的数字图像处理之图像阈值分割算法研究
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Matlab数字图像处理实践报告实践三:图像阈值分割算法研究
3.1.1 迭代法实践代码:
clc;
clear all;
f=imread('cat.bmp');
f=rgb2gray(f);
f=im2double(f);
T=0.5*(min(f(:))+max(f(:)));
done=false;
while ~done
g=f>=T;
Tn=0.5*(mean(f(g))+mean(f(~g)));
done=abs(T-Tn)<0.1;
T=Tn;
end
T
r=im2bw(f,T);
subplot(121),imshow(f),title('原图');
subplot(122),imshow(r),title('阈值分割算法研究--迭代法');
3.1.2 迭代法实践截图:
3.2.1 均匀性度量法实践代码:
clc;
clear all;
I=imread('cat.bmp');
I=rgb2gray(I);
I=double(I);
[m,n]=size(I);
Smin=-1;
for T=0:255
sum1=0; num1=0;
sum2=0; num2=0;
for i=1:m
for j=1:n
if I(i,j)>=T
sum2=sum2+I(i,j);
num2=num2+1; else
sum1=sum1+I(i,j);
num1=num1+1; end
end
end
ave1=sum1/num1;
ave2=sum2/num2;
d1=-1;
d2=-1;
for i=1:m
for j=1:n
if I(i,j)>=T
d=(I(i,j)-ave2)^2;
if d2==-1
d2=d;
else
d2=d2+d;
end
else
d=(I(i,j)-ave1)^2;
if d1==-1
d1=d;
else
d1=d1+d;
end
end
end
end
p1=num1/(m*n);
p2=num2/(m*n);
S=p1*d1+p2*d2;
if(Smin==-1)
Smin=S;
else
if(S Smin=S; Th=T; end end end Th subplot(121),imshow(uint8(I)),title('原图'); for i=1:m for j=1:n if I(i,j)>=Th I(i,j)=255; else I(i,j)=0; end end end subplot(122),imshow(I),title('阈值分割算法研究--均匀性度量法'); 3.2.2 均匀性度量法实践截图: 3.3.1 类间最大距离法实践代码: clc; clear all; I=imread('cat.bmp'); I=rgb2gray(I); I=double(I); [m,n]=size(I); Smax=0; for T=0:255 sum1=0; num1=0; sum2=0; num2=0; for i=1:m for j=1:n if I(i,j)>=T sum2=sum2+I(i,j); num2=num2+1; else sum1=sum1+I(i,j); num1=num1+1; end end end ave1=sum1/num1; ave2=sum2/num2; S=((ave2-T)*(T-ave1))/(ave2-ave1)^2; if(S>Smax) Smax=S; Th=T; end end Th subplot(121),imshow(uint8(I)),title('原图'); for i=1:m for j=1:n if I(i,j)>=Th I(i,j)=255; else I(i,j)=0; end end end subplot(122),imshow(I),title('阈值分割算法研究--类间最大距离法'); 3.3.2 类间最大距离法实践截图: 3.4.1 最大类内类间方差比法实践代码: clc; clear all; I=imread('cat.bmp'); I=rgb2gray(I); I=double(I); [m,n]=size(I); Smax=-1; for T=0:255 sum1=0; num1=0; sum2=0; num2=0; for i=1:m for j=1:n if I(i,j)>=T sum2=sum2+I(i,j); num2=num2+1; else sum1=sum1+I(i,j); num1=num1+1; end end end ave1=sum1/num1; ave2=sum2/num2; ave=(sum1+sum2)/(m*n); d1=-1; d2=-1; for i=1:m for j=1:n if I(i,j)>=T d=(I(i,j)-ave2)^2;