欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MATLAB数字图像处理的应用

程序员文章站 2022-04-01 10:25:52
...

一、利用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('分割后图像');