matlab 图像处理教程,MATLAB数字图像处理从入门到精通(持续更新)

% 本程序能够实现分水岭算法

% 分水岭算法

clear, close all;

clc;

PathName='t ';%t为自填内容,下面p类似

FileName=[PathName 'p'];

Image=imread(FileName);

subplot(2,2,1);subimage(Image);title('原图')

I=imread(t’tank.jpg’);

I=rgb2gray(I);

Image=I;

Image=double(Image);

B=[1,1,1;1,1,1;1,1,1];%方形结构元

E8=[-1,0;-1,1;0,1;1,1;1,0;1,-1;0,-1;-1,-1]; % 8-连通结构元坐标

maskLenth=length(E8); % 结构元点的个数

[X,Y]=size(Image);

%原始图像image 赋值给A1

n=1;

A(:,:,n)=Image;

M=zeros(X,Y);

Mark_Image=zeros(X,Y);

%产生距离图

while sum(sum(A(:,:,n)))~=0

A(:,:,n+1)= imerode(A(:,:,n),B);

U(:,:,n)= (A(:,:,n)-A(:,:,n+1))*n;

U(:,:,n)=double(U(:,:,n));

M=M+U(:,:,n);

n=n+1;

end

n=n-1;

subplot(2,2,2);imagesc(M,[0,n]);title('距离图');

% 搜寻局部最大值,将其放入Deal_Image

Deal_Image=zeros(X,Y);

while n>0

for high=1:X

for width=1:Y

%********************************************************************

Mark_Bool=0;

if M(high,width)==n

%______________________________________________________________

for dot=1:maskLenth

i=E8(dot,1); j=E8(dot,2);

if high+i>=1 & width+j>=1 & high+i<=X & width+j<=Y & M(high+i,width+j)>M(high,width);

Mark_Bool=1;break;

end % if_end

end % for dot_end

%______________________________________________________________

if Mark_Bool==0;

Deal_Image(high,width)=M(high,width);

end %if end

%______________________________________________________________

end %if end

%********************************************************************

end %for-end

end %for-end

n=n-1;

end % while n=0 end

Deal_Image =[Deal_Image>=1]

subplot(2,2,3);subimage(Deal_Image);title('输出图像');

Mark_Number=1;

while n>0

for high=1:X

for width=1:Y

Mark_Bool=0;

%********************************************************************

if M(high,width)==n

%______________________________________________________________

for dot=1:maskLenth

i=E8(dot,1); j=E8(dot,2);

if high+i>=1 & width+j>=1 & high+i<=X & width+j<=Y & Mark_Image(high+i,width+j)>0;

Mark_Image(high,width)=Mark_Image(high+i,width+j);

Mark_Bool=1;break;

end % if_end

end % for dot_end

%______________________________________________________________

if Mark_Bool==0;

Mark_Image(high,width)=Mark_Number;

Mark_Number=Mark_Number+1;

end %if end

%______________________________________________________________

pause;

subplot(2,2,2);imagesc(Mark_Image,[0,Mark_Number]);title('输出图像');

end %if end

%********************************************************************

end %for-end

end %for-end

n=n-1;

end % while n=0 end

subplot(2,2,3);imagesc(Mark_Image,[0,Mark_Number]);title('分割后的图像');

uicontrol('Style','edit','string',['分割出区域:',Num2str(Mark_Number-1),'个'],...

'Position', [400 0 150 18],'FontSize',12,'FontWeight','light');

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值