✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
为提取云团反射率图像内部层次类特征和轮廓线上不规则的凹陷类特征,在构建基于图像内容的层次结构模型的基础上,提出相对极坐标系下的距离链码和基于八方向链码的累积导数和差码方法,前者用于层次类特征提取,后者用于轮廓形态特征的提取,构建梯度特征、云砧特征以及凹陷特征的提取算法.实验证明,该方法下的特征类间区分度高,运行速度快,可用于解决非刚体图像的相关特征的提取.
⛄ 完整代码
%此函数来提取特征线链码%-------------------------%-------------------------%im为输入图像。注意,该图像必须是经过sobel,log,canny,prewitt等算子进行过边缘提取后的二值图像%result为返回值,返回一个矩阵。矩阵的每行前两个数记录每一条特征线的起始坐标x1,y1值,终点坐标x2,y2。每行其余值记录每条特征线的链码。%--------方向表------% 1 2 3% 8 4% 7 6 5%--------------------function result=listcode(im)im2=im;[m n]=size(im);count=1; %用来记录特征线的数量%遍历原图,搜索链码起始点for i=1:m for j=1:n if(im2(i,j)==1) xy=searchtip(im2,i,j); [m n]=size(im2); x0=xy(1); %用points记录所有链码起始点的位置 y0=xy(2); next=1; %用来判断是否结束对当前链码的搜索 number=1; %用来记录当前链码以搜索点的数量 list=[]; list(number)=0; x=xy(1); y=xy(2); %每当搜索到一个起始点,搜索其周围点,追寻链码轨迹 while(next==1) if(x<=0|x>m|y<=0|y>n) %如果链码当前点已到达边界,则停止搜索 next=0; else im2(x,y)=0; %把已搜索过的点值置零,以免重复搜索 %按照方向表中从1到8的顺序检索当前点周围是否存在非0点 if(im2(x,y+1)==1) list(number)=4; x=x; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) %判断是否回到起始点,若是则当前特征线链码提取结束 next=0; end elseif(im2(x+1,y)==1) list(number)=6; x=x+1; y=y; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im2(x,y-1)==1) list(number)=8; x=x; y=y-1; x1=x; y1=y; number=number+1; if(x==x0&y==y0) next=0; end elseif(im2(x-1,y)==1) list(number)=2; x=x-1; y=y; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im2(x+1,y+1)==1) list(number)=5; x=x+1; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im2(x+1,y-1)==1) list(number)=7; x=x+1; y=y-1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im2(x-1,y-1)==1) list(number)=1; x=x-1; y=y-1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im2(x-1,y+1)==1) list(number)=3; x=x-1; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end else next=0; end end end list1=[x0 y0 x1 y1 list(:)']; [p q]=size(list1); list2(count,1:q)=list1; count=count+1; end endend%figure:imshow(im);%figure:imshow(im2);result=list2;end
%此程序用来从特征线上一点搜索其端点%im2为输入图像二值图像,x0,y0为起始端点坐标function xy=searchtip(im2,x0,y0)im=im2;[m n]=size(im);xy(1)=x0;xy(2)=y0;next=1; %用来判断是否结束对当前链码的搜索x=x0;y=y0;%每当搜索到一个起始点,搜索其周围点,追寻链码轨迹while(next==1) if(x<=0|x>m|y<=0|y>n) %如果链码当前点已到达边界,则停止搜索 next=0; else im(x,y)=0; %把已搜索过的点值置零,以免重复搜索 %按照方向表中从1到8的顺序检索当前点周围是否存在非0点 if(im(x,y+1)==1) x=x; y=y+1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) %判断是否回到起始点,若是则当前特征线链码提取结束 next=0; end elseif(im(x+1,y)==1) x=x+1; y=y; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x,y-1)==1) x=x; y=y-1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x-1,y)==1) x=x-1; y=y; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x+1,y+1)==1) x=x+1; y=y+1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x+1,y-1)==1) x=x+1; y=y-1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x-1,y-1)==1) x=x-1; y=y-1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end elseif(im(x-1,y+1)==1) x=x-1; y=y+1; xy(1)=x; xy(2)=y; if(x==x0&y==y0) next=0; end else next=0; end endendend
%此函数用来根据一个已知点来提取以该点为端点的特征线的链码%im为输入二值图像,x0,y0为端点坐标function result=getcode(im,x0,y0)[m n]=size(im);points(1)=x0; %用points记录所有链码起始点的位置points(2)=y0;next=1; %用来判断是否结束对当前链码的搜索number=1; %用来记录当前链码以搜索点的数量list=[];list(number)=0;x=x0;y=y0;%每当搜索到一个起始点,搜索其周围点,追寻链码轨迹while(next==1) if(x<=0|x>m|y<=0|y>n) %如果链码当前点已到达边界,则停止搜索 next=0; else im(x,y)=0; %把已搜索过的点值置零,以免重复搜索 %按照方向表中从1到8的顺序检索当前点周围是否存在非0点 if(im(x,y+1)==1) list(number)=4; x=x; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) %判断是否回到起始点,若是则当前特征线链码提取结束 next=0; end elseif(im(x+1,y)==1) list(number)=6; x=x+1; y=y; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im(x,y-1)==1) list(number)=8; x=x; y=y-1; x1=x; y1=y; number=number+1; if(x==x0&y==y0) next=0; end elseif(im(x-1,y)==1) list(number)=2; x=x-1; y=y; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im(x+1,y+1)==1) list(number)=5; x=x+1; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im(x+1,y-1)==1) list(number)=7; x=x+1; y=y-1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im(x-1,y-1)==1) list(number)=1; x=x-1; y=y-1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end elseif(im(x-1,y+1)==1) list(number)=3; x=x-1; y=y+1; x1=x; y1=y; number=1+number; if(x==x0&y==y0) next=0; end else next=0; end endendresult=[x0 y0 x1 y1 list(:)'];end
⛄ 运行结果
⛄ 参考文献
[1] 李富裕, 李言俊, 张科. 链码技术在景象图像特征提取中的应用[J]. 中国图象图形学报, 2008(1):5.
[2] 王萍, 强兆庆, 许晋玮,等. 基于链码描述的图像图形特征提取[J]. 计算机应用, 2009(8):4.
[3] 赵珊, 王彪, 唐超颖. 基于链码表示的手臂静脉特征提取与匹配[J]. 光学学报, 2016(5):12.

