1 迭代法
迭代法的的设计思想是,开始时选择一个阈值作为初始估计值,然后按某种策略不断的改进这一估计值,直到满足给定的准则为止。在迭代过程中,关键之处在于选择什么样的阈值改进策略。好的改进策略应该具备两个特征:一是能够快速收敛,二是在每一个迭代过程中,新产生的阈值优于上一次的阈值。
代码:
%迭代法
clc;
clear all;
f=imread('H:\数字图像处理\图片\标准图片集\baboon.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);
figure,imshow(f),title('原图');
figure,imshow(r),title('迭代法');
2 Otsu
该算法是日本人Otsu提出的一种动态阈值分割算法。它的主要思想是按照灰度特性将图像划分为背景和目标2部分,划分依据为选取门限值,使得背景和目标之间的方差最大。(背景和目标之间的类间方差越大,说明这两部分的差别越大,当部分目标被错划分为背景或部分背景错划分为目标都会导致这两部分差别变小。因此,使用类间方差最大的分割意味着错分概率最小。)这是该方法的主要思路。
代码:
%Ostu
clc;
clear all;
I=imread('H:\数字图像处理\图片\标准图片集\baboon.bmp');
I=rgb2gray(I);
I=double(I);
figure,imshow(uint8(I)),title('原图');
[m,n]=size(I);
Th=Otsu(I);
Th
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
figure,imshow(I),title('Otsu法');
function T=Otsu(I)
[m,n]=size(I);
I=double(I);
count=zeros(256,1);
pcount=zeros(256,1);
for i=1:m
for j=1:n
pixel=I(i,j);
count(pixel+1)=count(pixel+1)+1;
end
end
dw=0;
for i=0:255
pcount(i+1)=count(i+1)/(m*n);
dw=dw+i*pcount(i+1);
end
Th=0;
Thbest=0;
dfc=0