一、利用MATLAB生成LOG算子图像
%%用matlab生成LOG图像
x=-2:0.06:2
y=-2:0.06:2
sigma=0.6
y=y';
for i=1:(4/0.06+1)
xx(i,:)=x;
yy(:,i)=y;
end
r=1/(2*pi*sigma^4)*((xx.^2+yy.^2)/(sigma^2)-2).*exp(-(xx.^2+yy.^2)/(sigma^2));
colormap(jet(16));
mesh (xx,yy,r);
figure;
二、用分水岭算法分割图像
%%用分水岭算法分割图像
I=imread('cdl.png');
f=rgb2gray(I);
subplot(2,2,1);
imshow(f);
title('(a)原始图像');
subplot(2,2,2);
f=double(f);
hv=fspecial('prewitt');
hh=hv.';
gv=abs(imfilter(f,hv,'replicate'));
gh=abs(imfilter(f,hh,'replicate'));
g=sqrt(gv.^2+gh.^2);
subplot(2,2,2);
L=watershed(g);
wr=L==0;
imshow(wr);
title('(b)分水岭');
f(wr)=255;
subplot(2,2,3);
imshow(uint8(f));
title('(c)分割结果');
rm=imregionalmin(g);
subplot(2,2,4);
imshow(rm);
title('(d)局部极小值');
三、用区域分裂合并法分割图像
%%需调用的split函数
function v=split(b,mindim,fun)
k=size(b,3);
v(1:k)=false;
for i=1:k
quadrgn=b(:, :,i);
if size(quadrgn,1)<=mindim
v(i)=false;
continue;
end
flag=feval(fun,quadrgn);
if flag
v(i)=true;
end
end
end
%%需调用的predicate函数
function flag=predicate(region)
sd=std2(region);
m=mean2(region);
flag= (sd>5) & (m>0) & (m<200);
end
%%用区域分裂合并法分割图像
I=imread('cdl.png');
f=rgb2gray(I);
q=2^nextpow2(max(size(f)));
[m n]=size(f);
f=padarray(f,[q-m,q-n],'post');
mindim=2;
s=qtdecomp(f,@split,mindim,@predicate);
lmax=full(max(s(:)));
g=zeros(size(f));
marker=zeros(size(f));
for k=1:lmax
[vals,r,c]=qtgetblk(f,s,k);
if ~isempty(vals)
for i=1:length(r)
x1ow=r(i);
ylow=c(i);
xhigh=x1ow+k-1;
yhigh=ylow+k-1;
region=f(x1ow:xhigh,ylow:yhigh);
flag=feval(@predicate,region);
if flag
g(x1ow:xhigh,ylow:yhigh)=1;
marker(x1ow,ylow)=1;
end
end
end
end
g=bwlabel(imreconstruct(marker,g));
g=g(1:m,1:n);
f=f(1:m,1:n);
subplot(1,2,1),imshow(f),title('原始图像');
subplot(1,2,2),imshow(g),title('分割后图像');