链码简介及MATLAB提取彩色图像链码

news2024/12/29 13:36:21

一、链码

    链码(又称为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);

三、部分运行结果

四、原始图像

如果大家觉得本文对你有帮助,请关注、点赞和收藏,感谢大家支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于遗传算法的BP神经网络+代码解析

嗨&#xff0c;我是射手座的程序媛&#xff0c;期待和大家更多的交流与学习&#xff0c;欢迎添加3512724768。 基于遗传算法的BP神经网络代码解析 自己在2024年年初开始时&#xff0c;因为某些原因&#xff0c;了解到了基于遗传算法的神经网络。之前&#xff0c;对遗传算法并…

韦东山瑞士军刀项目自学之复习OS中断相关知识

和STM32无关&#xff0c;单纯是为了秋招复习一下中断的流程&#xff0c;其中涉及到内核态与用户态之间的转换&#xff0c;以及系统调用等等

开源免费软件一键瘦身你的Windows系统-Win11Debloat

开源免费软件一键瘦身你的Windows系统-Win11Debloat 前言 随着 Windows 11 的发布&#xff0c;许多用户发现系统中预装了大量的应用和功能&#xff0c;这些应用和功能可能会影响系统的性能和用户体验。为了帮助用户优化他们的 Windows 11 系统&#xff0c;可以使用一个名为 W…

VBA代码解决方案第十六讲:如何引用工作表(引用工作表的方式)

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

Mybatis的写增删改查的方法

一、Mybatis环境配置&#xff1a; 环境的配置我在前面的文章里有详细写https://blog.csdn.net/daibadetianshi/article/details/140698718?spm1001.2014.3001.5501https://blog.csdn.net/daibadetianshi/article/details/140698718?spm1001.2014.3001.5501 二、方法之用注解…

探索有赞小程序:揭秘其强大的组件库功能!

有赞小程序组件库是针对有赞小程序开发者提供的一套组件&#xff0c;它提供了丰富的功能和样式&#xff0c;方便开发者快速搭建和定制各种有赞小程序页面。下面将从四个方面对有赞小程序组件库的功能做详细的阐述。 1、UI组件 可实时在线编辑的设计工具——即时设计https://a…

【C++】C++11之右值引用

目录 一、前言 二、概念 2.1 左值和左值引用 2.2 右值和右值引用 三、左值引用与右值引用的区别 四、应用场景 4.1 左值引用的短板&#xff08;将亡值&#xff09; 4.2 右值引用的意义&#xff08;移动语义&#xff09; 五、右值引用引用左值 六、万能引用和完美转发…

从零开始手写STL库:HashTable

从零开始手写STL库–HashTable的实现 Gihub链接&#xff1a;miniSTL 文章目录 从零开始手写STL库–HashTable的实现HashTable是什么HashTable需要包含什么函数基础成员部分基础函数部分可用函数部分 其他函数总结 HashTable是什么 HashTable在STL中直接出现的情况并不多&…

宝塔部署springboot vue ruoyi前后端分离项目,分离lib、resources

1、“文件”中创建好相关项目目录,并将项目相关文件传到对应目录 例如&#xff1a;项目名称/ #项目总目录 api/ #存放jar项目的Java项目文件 manage/ #vue管理后端界面 …

计网面试题

OSI七层模型 物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输层&#xff0c;会话层&#xff0c;表示层&#xff0c;应用层 TCP/IP四层模型 应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;网络层接口 HTTP&#xff08;超文本传输协议&#xff09;…

C语言典型例题20

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题2.8 有两个整形变量a和b&#xff0c;将他们两个的值进行互换 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //例题2.8 有两个整形变量a和b&#xff0c;将他们两个的值进行…

【通俗理解】牛顿第三定律与生命反应——超越物自在主义的探讨

【通俗理解】牛顿第三定律与生命反应——超越物自在主义的探讨 牛顿第三定律与生命的类比 你可以把牛顿第三定律比作一个“即时回应器”&#xff0c;它表明作用力和反作用力总是同时、同量且反向发生。而生命则像是一个“策略玩家”&#xff0c;它不仅回应&#xff0c;还能操纵…

flutter存储日志文件代码

如题所示&#xff0c;我需要将flutter运行得到的相关日志信息存储成文件&#xff0c;可以按时间或者文件大小&#xff0c;将日志文件拆分存储成多个日志文件。在项目中我已实现这个功能&#xff0c;因为觉得有用&#xff0c;所以单独简化出来放在一个demo中。 这里给出我整理出…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

day11 Stream流、File、方法递归、字符集、IO流(巨多API)

目录 1.Stream流 1.1认识Stream流 1.2Stream流处理数据的步骤 1.3获取Stream流 1.3.1获取集合的Stream流 1.3.2获取数组的Stream流 1.4Stream提供的常用方法 1.5终结、收集Stream流 1.5.1终结方法 1.5.2收集方法 2.可变参数 2.1可变参数是什么 2.2可变参数的特点和…

80.WEB渗透测试-信息收集-框架组件识别利用(4)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;79.WEB渗透测试-信息收集-框架组件识别利用&#xff08;3&#xff09;-CSDN博客 springb…

基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

《如鸢》开通官号,女性向游戏爆款预定

今天&#xff0c;备受瞩目的沉浸式剧情卡牌手游《如鸢》正式开通了官方社媒账号并发布了玩家信。 《如鸢》由灵犀互娱倾力打造&#xff0c;游戏不仅拥有跌宕起伏的权谋剧情&#xff0c;更采用Live2D技术&#xff0c;为玩家带来沉浸式的游戏体验&#xff0c;吸引了众多玩家关注。…

基于SpringBoot+Vue的企业客户信息反馈平台(带1w+文档)

基于SpringBootVue的企业客户信息反馈平台(带1w文档) 基于SpringBootVue的企业客户信息反馈平台(带1w文档) 企业客户信息反馈平台的开发运用java技术&#xff0c;MIS的总体思想&#xff0c;以及MYSQL等技术的支持下共同完成了该平台的开发&#xff0c;实现了企业客户信息反馈管…