基于matlab实现链码提取

✅作者简介:热爱科研的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.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值