基于matlab实现链码提取

简介: 基于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电子书和数学建模资料



相关文章
|
安全 虚拟化 数据安全/隐私保护
比较本地部署与私有云方案:选择适合你的ERP系统
比较本地部署与私有云方案:选择适合你的ERP系统
1614 2
|
JSON 数据格式
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
2799 0
|
监控 Go
Golang 语言 beego v2 之路由设置
Golang 语言 beego v2 之路由设置
463 0
|
存储 物联网 PyTorch
基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例
**Torchtune**是由PyTorch团队开发的一个专门用于LLM微调的库。它旨在简化LLM的微调流程,提供了一系列高级API和预置的最佳实践
639 59
基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例
|
机器学习/深度学习 自然语言处理 算法
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
本文探讨了通过多模型集成技术提升信息检索系统性能的方法,重点介绍了RAPTOR框架。RAPTOR通过构建层次化的信息组织结构和递归摘要技术,显著提高了检索系统的性能和适应性。研究建立在RAG Fusion技术基础上,旨在提供更全面的信息检索解决方案。
891 2
RAPTOR:多模型融合+层次结构 = 检索性能提升20%,结果还更稳健
|
消息中间件 存储 监控
实战Linux I/O多路复用:借助epoll,单线程高效管理10,000+并发连接
本文介绍了如何使用Linux的I/O多路复用技术`epoll`来高效管理超过10,000个并发连接。`epoll`允许单线程监控大量文件描述符,显著提高了资源利用率。文章详细阐述了`epoll`的几个关键接口,包括`epoll_create`、`epoll_ctl`和`epoll_wait`,以及它们在处理并发连接中的作用。此外,还探讨了`epoll`在高并发TCP服务场景的应用,展示了如何通过`epoll`和线程/协程池来构建服务框架。
1308 107
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
1863 1
|
数据采集 存储 Java
Crawler4j在多线程网页抓取中的应用
Crawler4j在多线程网页抓取中的应用
|
JavaScript Java 测试技术
基于Java的教务管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的教务管理系统的设计与实现(源码+lw+部署文档+讲解等)
226 0
|
存储 缓存 安全
企业出海合规:如何区分数据控制者与数据处理者
数据控制者是确定个人数据处理目的和方式的实体,负有最大责任,需保护数据主体的隐私。数据处理者是按照控制者指示处理个人数据的实体,负责数据安全和协助控制者履行职责。两者需通过明确的合同规定责任。数据控制者的职责包括确定目的、获得同意、确保安全、提供透明度、促进权利行使、进行DPIA和建立协议。数据处理者负责按指示处理数据、确保安全和保密、协助控制者、处理数据泄露通知、数据删除和遵守法律。
1070 0