matlab计算图片链码,MATLAB--数字图像处理 计算图像链码及其相似多边形

article/2025/10/3 5:39:27

题目

计算下面图像 边界阶数为20的形状数及其相应的近似多边形

bf2648518ed1

在这里插入图片描述

概念

形状数:链码的最小一阶差分码

简单说来求形状数就是:先求出图像的链码 ,再求其一阶差分码,最后找一阶差分码的最小值

bf2648518ed1

在这里插入图片描述

bf2648518ed1

在这里插入图片描述

bf2648518ed1

在这里插入图片描述

链码:用曲线(或折线)起始点的坐标和边界点方向代码来描述曲线或边界的方法

有4方向、8方向链码之分。

bf2648518ed1

在这里插入图片描述

那么具体怎么计算链码呢?

bf2648518ed1

在这里插入图片描述

拿上图8方向链码举例(右图):

假设起始点为1,则链码为 1 0 1 3 6 6 6 6 6…

这里说一下怎么求一阶差分链码:

假设4方向链码为 0 2 1 3 1 3 0

那么一阶差分链码为: 2 3 2 2 2 1 0

具体怎么来的呢?

bf2648518ed1

在这里插入图片描述

bf2648518ed1

在这里插入图片描述

解释:

从0—>2,按照逆时针旋转规则,0旋转到2,需要走2步:0–1—2

从2–>1,需要3步:2–3--0–1

依次类推

注意最后一个(0),其实就是起始点,形成闭合

C++算法(以4方向链码为例)

计算第一个数与第二个数差值

比较二者大小

若第一个数大,则一阶差分为 差值相反数

若第二个数大,则一阶差分为 4-差值

整理计算链码算法

对图像进行预处理 ,比如去除噪声、边缘化等 依照不同图片采取不同措施

进行重取样(重取样原理在下面代码中)

随便找一个起始点,记录起始位置

利用循环 or 递归 求链码(类似C++中的走迷宫)

实验代码

注:这里图片记得使用题目所给图像,否则需要对下面代码进行修改

该代码仅为 测试算法 还未封装为function

% write by 海轰

%该程序针对特定图片其作用

%为测试程序

t=im2bw(imread('homework1.png'));

%过滤边缘白点 这里仅针对这幅图像

t(:,1)=0;

t(140:145,:)=0;

imshow(t),title('原图');

[m,n]=size(t);

%行扫描 找出图像白色区域最左边的端点

for i=1:m

x=0;y=141;

tem=t(i,:);

h=sum(tem);

if h~=0

for j=1:n

if tem(j)==1

x=j;

break

end

end

%行扫描 反转 寻找白点区域最右边的端点

tem=flip(tem);

for j=1:n

if tem(j)==1

y=n-j+1;

break;

end

end

%对区域进去填充 便于找到边界

for j=x+1:y-1

t(i,j)=1;

end

end

end

figure,imshow(t),title('填充区域后');

t=bwperim(t,8);

figure,imshow(t),title('找到边界');

a=t;

rt=zeros(145,141);

%对图像进行重取样

%假设原图像为100*100 一点为(62,73)

%重取样模板为100*100 但是间隔为10 (分成10*10)

%先对(62,73)/10=(6.2,7.3)

%再取整 (6,7)

%再还原 10*(6,7)=(60,70)

%这样重取样后得到(60,70)

for i=1:m

for j=1:n

if t(i,j)==1

if round(j/15)==0

rt(15*round(i/15),15*(round(j/15)+1))=1;

else

rt(15*round(i/15),15*round(j/15))=1;

end

end

end

end

figure,imshow(rt),title('重取样后');

stack=[0 0];%保存起点

code=[];%保存链码

points=zeros(25,2);%保存端点

k=0;

t=rt;

%随便寻找起点

for i=1:m

for j=1:n

if t(i,j)==1

stack=[i j];

break;

end

end

end

s1=stack(1);

s2=stack(2)+1;

%while循环求链码

while (s1~=stack(1)||s2~=stack(2))&&k<500

k=k+1;

if k==1

s2=s2-1;

end

if s2+15<=141

if t(s1,s2+15)==1

code(k)=0;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1;s2=s2+15;

continue;

end

end

if s1-15>0&&s2+15<=141

if t(s1-15,s2+15)==1

code(k)=1;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1-15;

s2=s2+15;

continue;

end

end

if s1-15>0

if t(s1-15,s2)==1

code(k)=2;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1-15;s2=s2;

continue;

end

end

if s1-15>0&&s2-15>0

if t(s1-15,s2-15)==1

code(k)=3;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1-15;s2=s2-15;

continue;

end

end

if s2-15>0

if t(s1,s2-15)==1

code(k)=4;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1;s2=s2-15;

continue;

end

end

if s2-15>0

if t(s1+15,s2-15)==1

code(k)=5;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1+15;

s2=s2-15;

continue;

end

end

if t(s1+15,s2)==1

code(k)=6;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1+15;s2=s2;

continue;

end

if s2+15<=141

if t(s1+15,s2+15)==1

code(k)=7;

points(k,1)=s1;

points(k,2)=s2;

t(s1,s2)=0;

s1=s1+15;

s2=s2+15;

continue;

end

end

end

xt=rt-t;

figure,imshow(xt),title('相似多边形'),hold on;

for i=1:25

if i==25

plot([points(25,2);points(1,2)],[points(25,1);points(1,1)]);

else

plot(points(i:i+1,2),points(i:i+1,1));

end

end

结果图

bf2648518ed1

在这里插入图片描述

bf2648518ed1

在这里插入图片描述

bf2648518ed1

haihong.png


http://chatgpt.dhexx.cn/article/jLtxdbbU.shtml

相关文章

链码的打包与升级

目录 1、链码的打包与签名 ​编辑 对链码的签名 1、安装已经添加签名的链码 2、安装成功之后进行链码的实例化操作&#xff0c;同时指定其背书策略 测试 1、查询链码 2、调用链码 3、查询链码 链码的升级 1、安装链码 2、升级链码 3、测试 1、查询 2、调用 3、…

fabric链码的编写-入门

链码的编写 前言:fabric链码的编写较简单&#xff0c;在熟悉了基本结构和相关API之后就可上手编写&#xff0c;但是要多多练习&#xff0c;提高编写链码的速度和正确度。 学习步骤&#xff1a; 1.熟悉链码的基本结构 2.熟练链码相关API 3.练习&#xff0c;练习&#xff0c…

Hyperledger Fabric 链码

懂哪写哪&#xff0c;随时补充 链码结构 链码API 链码在开发过程中需要实现链码接口&#xff0c;交易的类型决定了哪个接口函数将会被调用&#xff0c;链码的接口定义如下&#xff1a; type Chaincode interface {Init(stub ChaincodeStubInterface) pb.ResponseInvoke(stu…

fabric2.3链码对比1.4链码小记

最近实验室的项目要部署到fabric2.0以上版本&#xff0c;之前写的都是1.4的链码&#xff0c;现在看2.0版本的链码还是有些不一样的&#xff0c;主要是链码api改了&#xff1a; 前提&#xff1a;如果想在fabric2.0以上环境中还是想用shim和peerAPI的话&#xff1a;也就是&#…

Hyperledger Fabric 链码生命周期

目录 一、什么是链码 二、部署链码 2.1 安装和定义链码 2.1.1 打包智能合约 2.1.2 peer节点安装链码 2.1.3 组织批准链码 2.1.4 将链码提交到通道 2.2 升级链码 总结 一、什么是链码 ChainCode&#xff08;链码&#xff09;是一个程序&#xff0c;用Go、Node.js或Java编…

matlab freeman链码,对Freeman链码分析的角点检测算法

图像中的角点是图像的重要特征, 具有旋转不变性, 决定了图像形状, 可以降低图像信息的存储效率, 在目标跟踪, 目标检测, 图像匹配, 图像轮廓拟合等领域都有重要的应用价值. 近几十年来, 国内外学者提出的图像角点检测算法[, 各有各的优缺点, 大致可分为三大类: 基于灰度强度的角…

Fabric链码升级

一、修改链码&#xff0c;上传 二、打包链码 1、设置组织1环境变量 export PATH${PWD}/../bin:$PATH export FABRIC_CFG_PATH$PWD/../config/ # Environment variables for Org1 export CORE_PEER_TLS_ENABLEDtrue export CORE_PEER_LOCALMSPID"Org1MSP" export C…

图像特征-链码(Freeman code)

目录 引言链码编程实现轮廓提取链码计算 总结 引言 本文介绍了图像的形状特征–链码&#xff0c;以及通过python和opencv实现的链码提取方法。所有opencv的版本为3.4.2&#xff0c;已经移除了直接返回链码的选项。 链码 链码用于描述图像的形状特征&#xff0c;首先需要获得图像…

Java知识扫盲——向上转型(类向上转型、接口向上转型)以及向上转型的优势、灵活运用

目录 普通类示例 抽象类的向上转型&#xff0c; 接口向上转型&#xff1a; 作用&#xff1a;使用向上转型可以&#xff0c;提高代码的简洁性、灵活性、适用性。 普通类示例 父类&#xff1a; package 普通类向上转型;public class Father {public int age 48;public void…

java 向上转换_java的向上转型总结

在《think of java》中对向上转型有着如下的描述 看完之后很蒙圈&#xff0c;所以自己在网上找了一些描述&#xff0c;并自己做了简单的总结 简单的例子 class A{ public void A1(){ System.out.println("父类方法1"); } public void A2(){ System.out.println("…

JAVA中多态以及向上转型向下转型、重写的讲解

重写 重写(override)&#xff1a;也称为覆盖。重写是子类对父类非静态、非private修饰&#xff0c;非final修饰&#xff0c;非构造方法等的实现过程 进行重新编写, 注意&#xff01;&#xff01;&#xff01;返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#x…

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西&#xff0c;在讲到转型之前我们需要认识到继承过程中的对象类型转换&#xff0c;这种转换有两个特点&#xff1a; 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候&#xff0c;发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始&#xff1a; 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量&#xff0c; 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法&#xff0c;但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&#xff1b;反过来&#xff0c;float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目&#xff0c;发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意&#xff0c;二是自己心里太急躁了。所以这个要自己应以为鉴&#xff01; 对象的转型问题其实并不复杂&#xff0c;我们记住一句话&#xff1a;“父类…

java 向上转型_Java 转型问题(向上转型和向下转型)

Java 转型问题其实并不复杂&#xff0c;只要记住一句话&#xff1a;父类引用指向子类对象。 什么叫父类引用指向子类对象&#xff1f; 从 2 个名词开始说起&#xff1a;向上转型(upcasting) 、向下转型(downcasting)。 举个例子&#xff1a;有2个类&#xff0c;Father 是父类&a…

java向上转型_Java向上转型

向上类型转换&#xff1a; 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 2.父类引用变量无法调用子类新增成员变量和新增成员方法。 举个例子 public classAnimal { public voidsleep() { System.out.println("Animal sleep"); } public voidjump(…

向上转型与向下转型(超详细)

本文利用代码例子解释向上转型与向下转型&#xff0c;文末有举例整合原代码。 首先&#xff0c;我们要知道&#xff1a;转型发生在继承后&#xff0c;也就是父类子类存在的前提下。其次&#xff0c;我们要清楚&#xff1a;向下转型的前提是已经发生了向上转型&#xff0c;向下转…

java向上转型

我们知道按照现有类的类型来创建新类的方式为继承。 换句话说 “新类是现有类的一种类型” 因为继承可以确保父类中所有的方法在子类中也同样有效&#xff0c;所以能够向父类发送的所有信息也同样可以向子类发送。 这儿有一个例子&#xff1a; public class Test {public sta…