链码简介及MATLAB提取彩色图像链码
一、链码
链码(又称为freeman code)是一种通过带有给定方向的单位长度的线段序列来描述轮廓边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。在二维图像中,链码可以表示为一系列的方向码,每个方向码代表轮廓上相邻两点之间的方向。常见的链码表示方法有基于4-邻接(如图a)和8-邻接(如图b)的,其中8-邻接链码能够更准确地描述轮廓的边缘信息,因为它考虑了像素点周围的所有8个方向。


(a)4方向链码的方向数 (b)4方向链码的方向数
如(c)图所示是一个4方向链码,假如从黑点沿着逆时针开始,其链码为3 0 0 3 0 1 1 2 1 2 3 2,如果从红点沿着逆时针开始,则其链码为2 1 2 3 2 3 0 0 3 0 1 1。

(c) ( d )
从上面可以看出,同一条边界沿着不同的起点其链码不同。因此,边界的链码依赖于起始点。为了确定链码所表示的曲线边界在图像中的位置,并能由链码准确地重建曲线边界,则需要标出起点的坐标。但在实际应用中,由于起点和终点重合,当用链码来描述闭合边界时,通常不关心起点的具体位置,起点位置的变化只引起链码的循环位移。为了解决上述问题,需要将链码进行归一化处理。
给定一个从任意点开始产生的边界链码,把它看成一个由各个方向数构成的自然数。将这些方向数依照一个方向(逆时针或顺时针)循环以使它们所构成的自然数的值最小,将转化后所对应的链码起点作为这个边界的归一化链码的起点。因此,图(C)和图(d)研逆时针的归一化链码为0 0 3 0 1 1 2 1 2 3 2 3。用链码表示给定目标的边界时,如果目标平移,链码不会发生变化,但如果目标旋转则链码会发生变化。
二、基于MATLAB的彩色图像的边界链码提取
clear all; %清除所有变量
close all; %关闭图形窗口
clc; %清屏
% 读取图像并转换为二值图像
img = imread('FC0.png'); % 替换为你的图像文件路径
grayImg = rgb2gray(img); % 如果原图是彩色的,则转换为灰度图
bwImg = imbinarize(grayImg); % 使用默认阈值进行二值化
% 找到边界点(这里直接使用bwboundaries,但注意它返回的是轮廓,不是链码)
[B,L] = bwboundaries(bwImg, 'noholes');
% 初始化链码列表
chainCodes = {};
% 遍历每个轮廓
for k = 1:length(B)
boundary = B{k};
% 初始化链码字符串(或数组),这里使用字符串方便查看
chainCodeStr = '';
% 遍历边界上的每个点(除了最后一个点,因为我们需要前一个点来确定方向)
for i = 1:size(boundary, 1) - 1
p1 = boundary(i, :);
p2 = boundary(i+1, :);
% 计算方向(这里简化了方向判断,只考虑水平和垂直)
% 在实际应用中,应使用更精确的方向计算
dx = p2(2) - p1(2);
dy = p2(1) - p1(1);
% 根据dx和dy的值确定方向(这里仅作为示例,实际中需要更详细的判断)
if dx > 0 && dy == 0
chainCodeStr = [chainCodeStr '0']; % 东
elseif dx == 0 && dy > 0
chainCodeStr = [chainCodeStr '2']; % 南
elseif dx < 0 && dy == 0
chainCodeStr = [chainCodeStr '4']; % 西
elseif dx == 0 && dy < 0
chainCodeStr = [chainCodeStr '6']; % 北
% 其他方向(东南、西南、西北、东北)需要更复杂的判断
else
% 如果dx和dy都不为0,则可能是对角线方向,需要更详细的判断
% 这里简单处理为不添加链码(或添加特定标记表示复杂情况)
chainCodeStr = [chainCodeStr '-']; % 示例中的特殊标记
end
end
% 将当前轮廓的链码添加到链码列表中
chainCodes{end+1} = chainCodeStr;
end
% 显示链码
disp('图像边界链码是')
disp(chainCodes);
三、部分运行结果

四、原始图像
如果大家觉得本文对你有帮助,请关注、点赞和收藏,感谢大家支持!!!
相关文章:
链码简介及MATLAB提取彩色图像链码
一、链码 链码(又称为freeman code)是一种通过带有给定方向的单位长度的线段序列来描述轮廓边界的方法,常被用来在图像处理、计算机图形学、模式识别等领域中表示曲线和区域边界。在二维图像中,链码可以表示为一系列的方向码,每个…...
二叉树,二叉查找树,平衡二叉树
一.绪论: 二.数据结构(二叉树): 1.简介: 1)每一个节点(也叫结点)都是一个独立的对象-->当中不仅要存数据值,还要存父节点地址值,左子节点地址值,右子 节点地址值 2)没有父节点或者子节点的节点就记为null 2.遍历方…...
《零散知识点 · SpringBoot 整合邮件功能》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
编程小白如何成为大神?大学新生的最佳入门攻略
目录 方向一:选择适合的编程语言 方向二:制定有效的学习计划 方向三:避免常见的学习陷阱 方向四:额外建议 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择…...
使用 PyInstaller 和 Hook 文件打包 APK 解析工具
错误信息如下: Traceback (most recent call last):File "test.py", line 4, in <module>File "<frozen importlib._bootstrap>", line 991, in _find_and_loadFile "<frozen importlib._bootstrap>", line 975, …...
【分布式】分库分表知识点大全
为什么要分库分表 随着业务量的增加导致数据库中数据量的增加,可能拖慢查询的性能,影响业务的可用性;如果数据库采用读写分离,可能会导致从库的延迟较大,主库进行写操作后,从库因为延迟无法及时同步&#…...
FreeRTOS中的定时器:xTimerCreate ,xTimerStart ,xTimerStop
1. 创建定时器 定时器的创建使用 xTimerCreate 函数。该函数有以下参数: pcTimerName:定时器的名字,主要用于调试。xTimerPeriodInTicks:定时器的周期,以系统节拍计时。uxAutoReload:定时器是否自动重载。如…...
【网络安全】文件上传黑白名单及数组绕过技巧
不安全的文件上传(Unsafe FileUpload) 不安全的文件上传是指Web应用程序在处理用户上传的文件时,没有采取足够的安全措施,导致攻击者可能利用这些漏洞上传恶意文件,进而对服务器或用户造成危害。 目录 一、文件上传…...
4.2、存储管理-页式存储
页式存储和段氏存储会考 页式存储几乎必考,段氏存储可能会考 页式存储 页式存储是操作系统的一种存储管理方式。 因为我们的程序往往是远远大于内存的,所以程序在执行的时候,是不会一次性把所有内容都装入到内存中,它会把程序分…...
60个常见的 Linux 指令
常见60个Linux指令 1.ssh 登录到计算机主机2.ls 列出目录内容3.pwd 当前终端会话所在的完整路径4.cd 切换当前工作目录5.touch 创建空文件或更新文件的时间戳6.echo 终端输出文本或变量值7.nano 在终端中编辑文件8.vim 文本编辑器9.cat 查看、连接和创建文件10.shred 安全删除敏…...
DockerRedis基础
目录 Docker 部署MySQL 镜像和容器 解析命令 Docker基础 常见命令 命令别名 数据卷 命令 自定义镜像 Dockerfile 网络 自定义网络设置静态IP Redis概述 NoSQL(非关系型数据库) Redis Redis命令行客户端 Redis数据结构 Redis通用命令&…...
oracle读写时相关字符集详解
服务器端操作系统(Oracle linux)字符集 服务器端数据库字符集 客户端操作系统(Oracle linux)字符集 客户端工具sqlplus字符集 结论1:客户端工具sqlplus的会话,使用的字符集,是数据库字符集。…...
OverlayFS 文件系统介绍
引言 OverlayFS(Overlay Filesystem)是 Linux 内核中的一种联合文件系统(Union Filesystem),它通过叠加多个目录形成一个单一的文件系统视图。作为 Docker 的默认存储驱动之一,OverlayFS 在提高性能和简化容…...
【C++】用Lua绑定C/C++对象,实现对脚本调用(依赖LuaBridge实现)
【C++】使用LuaBridge为Lua绑定C/C++对象,实现对脚本调用 问题: 如何在C++实现对如下脚本读取,在不改变代码的情况下实现修改脚本打开不同链接? <?xml version="1.0" encoding="utf-8"?> <root><script src="lua:lua_demo&quo…...
Java面试——Tomcat
优质博文:IT_BLOG_CN 一、Tomcat 顶层架构 Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服务。Service主要包含两个部分:Connector和…...
2024年7月个人工作生活总结
本文为 2024年7月工作生活总结。 研发编码 “康威定律(Conway’s Law)”思考 康威定律是 50 年前(1967 年)由 梅尔文康威 提出的,最初的说法如下: Any organization that designs a system (defined broa…...
快速方便地下载huggingface的模型库和数据集
快速方便地下载huggingface的模型库和数据集 方法一:用于使用 aria2/wgetgit 下载 Huggingface 模型和数据集的 CLI 工具特点Usage 方法二:模型下载【个人使用记录】保持目录结构数据集下载不足之处 方法一:用于使用 aria2/wgetgit 下载 Hugg…...
JAVA小白学习日记Day10
1.线程锁 使用Runnable接口和Lambda表达式: 在 EasyThreadA 类的 mainA 方法中,通过创建 Runnable 实例 run,并使用Lambda表达式。 EasyThreadA::method 绑定到 run 上。然后创建两个线程 a 和 b,分别启动它们,它们会…...
分布式相关理论详解
目录 1.绪论 2.什么是分布式系统,和集群的区别 3.CAP理论 3.1 什么是CAP理论 3.2 一致性 3.2.1 计算机的一致性说明 1.事务中的一致性 2.并发场景下的一致性 3.分布式场景下的一致性 3.2.2 一致性分类 3.2.3 强一致性 1.线性一致性 a) 定义 a) Raft算法…...
Linux基础知识之Shell命令行及终端中的快捷键
1.察看历史命令快捷键 按键 操作 ctrl p 返回上一次输入命令字符 ctrl n 返回下一次输入命令字符 ctrl r 输入单词甚至词组搜索匹配历史命令 alt p 输入字符查找与字符相接近的历史命令 alt . 向之前执行的命令的最后一个参数轮循, 并将之添加到当前光标之后…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
