用大津法自动得到阀值T,从而得到相应的二值图像。对图像I,记T为前景与背景的分割阀值,前景点数占图像比例w0,平均灰度为u0,;背景点数占图像比例为w1,平均灰度值为u1。图像的总平均灰度为uT= w0X u0+ w1X u1。从最小灰度值到最大灰度值遍历T,当T使得方差σ2= w0X(u0-uT)2+ w1X(u1-uT)2最大时,T即为分割的最佳阀值。方差为灰度分布均匀性的一种度量,方差值越大,说明构成图像的两部分差别越大,当部分当前错分为背景或部分背景错分为前景都会导致两部分差别变小,因此,是方差最大的分割以为着错分概率最小。直接应用大津法计算量较大,因此,在现实时采用了等价的公式:
σ2= w0X w1X(u0-u1)2。
具体程序如下:
clear all;
I=imread('C:\Users\zjy\Desktop\zhangwen.jpg');
subplot(1,3,1),imshow(I);
xlabel('a)原始图像');
level=graythresh(I);
BW=im2bw(I,level);
subplot(1,3,2),imshow(BW);
xlabel('b)graythresh函数计算阀值');
disp(strcat('graythresh函数计算灰度阀值:',num2str(uint8(level*255))));
IMAX=max(max(I));
IMIN=min(min(I));
T=double(IMIN+IMAX)/2;
ISIZE=size(I);
muxSize=ISIZE(1)*ISIZE(2);
for i=1;length(T)
TK=T(1,i);
ifground=0;
ibground=0;
FgroundS=0;
BgroundS=0;
for j=1:ISIZE(1)
for k=1:ISIZE(2)
tmp=I(j,k);
if(tmp>=TK)
ifground=ifground+1;
FgroundS=FgroundS+double(tmp);
else
ibground=ibground+1;
BgroundS=BgroundS+double(tmp);
end
end
end
w0=ifground/muxSize;
w1=ibground/muxSize;
u0=FgroundS/ifground;
u1=BgroundS/ibground;
T(2,i)=w0*w1*(u0-u1)*(u0-u1);
end
oMax=max(T(2,:));
idx=find(T(2,:)>=oMax);
T=uint8(T(1,idx));
disp(strcat('简化大律法计算灰度阀值:',num2str(T)));
BW=im2bw(I,double(T)/255);
subplot(1,3,3),imshow(BW);
xlabel('c)简化大律法计算灰度阀值');
运行程序后得到如下结果:
graythresh函数计算灰度阀值:133
ans =
3
简化大律法计算灰度阀值:128
在测试中发现:大津法选取出来的阀值非常理想,对于各种情况的表现都较为良好。虽然它在很多情况下都不是最佳的分割,但分割质量通常都有一定的保障,可以说是最稳定的分割。
采用边缘检测算子(Sobel)提取手掌的边缘;
具体程序如下:
[BW2,thresh]=edge(BW,'sobel');
disp('Sobel算子自动选择的阀值为:')
disp(thresh)
subplot(2,2,1);
imshow(BW2);
xlabel('b)自动阀值的Sobel算子边缘检测');
运行程序后得到的结果如下:
Sobel算子自动选择的阀值为:
0.0636
对二值化后的图像先进行膨胀运算、再进行腐蚀运算,将得到的结果与原图像相减,图像上所剩的点即为角点。先膨胀运算,再腐蚀运算,SE表示在进行膨胀与腐蚀时所用的结构元素。SE的确定是此次角点检测的关键所在。
SE=strel('disk',80);
BW3=imdilate(BW2,SE);
subplot(2,2,2);
imshow(BW3);
xlabel('b)膨胀后图像');
BW4=imerode(BW3,SE);
subplot(2,2,3);
imshow(BW4);
xlabel('c)腐蚀后图像');