(数字图像处理MATLAB+Python)第十一章图像描述与分析-第五、六节:边界描述和矩描述

文章目录

  • 一:边界描述
    • (1)边界链码
      • A:概述
      • B:边界链码改进
      • C:程序
    • (2)傅里叶描绘子
      • A:概述
      • B:程序
  • 二:矩描述
    • (1)矩
      • A:几何矩
      • B:不变矩组
    • (2)与矩相关的特征
      • A:二阶矩
      • B:主轴
      • C:等效椭圆
      • D:偏心率

一:边界描述

(1)边界链码

A:概述

边界链码:是一种用于图像处理和计算机视觉领域的技术,主要用于描述二进制图像中物体的轮廓。边界链码通过将轮廓转化为一系列有序的连续像素点来表示。边界链码的基本思想是从图像中选择一个起始点,然后按照一定的顺序遍历相邻像素,将它们连接起来形成一个闭合的轮廓。这些相邻像素的连接方式可以根据具体的算法不同而有所差异,常见的有4邻域链码和8邻域链码

在这里插入图片描述

如下图,以左下角0点为起始点,设其坐标为(0,3),4方向和8方向链码表示区域边界,则

  • 4方向链码:(0,3)0 0 0 1 1 1 2 3 2 3 2 3
  • 8方向链码:(0,3)0 0 0 2 2 2 4 5 5 6

在这里插入图片描述

边界链码特点如下

  • 由于表示一个方向数比表示一个坐标值所需比特数少,而且对每一个点又只需一个方向数就可以代替两个坐标值,因此链码表达可大大减少边界表示所需的数据量
  • 可以很方便地获取相关几何特征,如区域的周长
  • 隐含了区域边界的形状信息

边界链码缺点如下

  • 码串比较长
  • 噪声等干扰会导致小的边界变化,从而使链码发生与目标整体形状无关的较大变动
  • 目标平移时,链码不变,但目标旋转时,链码会发生变化

B:边界链码改进

多重网格采样:对原边界以较大的网格重新采样,并把与原边界点最接近的大网格点定为新的边界点。也可用于消除目标尺度变化链码的影响

在这里插入图片描述

边界链码的起点:起点不同,链码不同。把链码归一化可解决这个问题

  • 给定一个从任意点开始产生的链码,把它看作一个由各方向数构成的自然数
  • 将这些方向数依一个方向循环,以使它们所构成的自然数的值最小;
  • 将转换后所对应的链码起点作为这个边界的归一化链码的起点

一阶差分链码:链码中相邻两个方向数按反方向相减(后一个减前一个),目标发生旋转时,一阶差分链码不发生变化

在这里插入图片描述

C:程序

如下,统计边界链码,并利用链码重构目标区域边界

在这里插入图片描述


matlab

clear,clc,close all;
image=imread('morphplane.jpg');
figure,imshow(image),title('ԭͼ');
BW=im2bw(image);
[B,L]=bwboundaries(1-BW);
len=length(B);
chain=cell(len,1);
startpoint=zeros(len,2);
for i=1:lenboundary=B{i};everylen=length(boundary);startpoint(i,:)=boundary(1,:);for j=1:everylen-1candidate=[0 1;-1 1;-1 0;-1 -1;0 -1;1 -1;1 0;1 1];y=boundary(j+1,1)-boundary(j,1);x=boundary(j+1,2)-boundary(j,2);       [is,pos]=ismember([y x],candidate,'rows');     chain{i}(j)=pos-1;             end    
end
figure,imshow(L),title('»æÖÆÁ´Âë');
hold on
for i=1:lenx=startpoint(i,2);y=startpoint(i,1);plot(x,y,'r*','MarkerSize',12);boundary=chain{i};everylen=length(boundary);for j=1:everylencandidate=[y x+1;y-1 x+1;y-1 x;y-1 x-1;y x-1;y+1 x-1;y+1 x;y+1 x+1];next=candidate(boundary(j)+1,:);x=next(2);y=next(1);plot(x,y,'g.');end
end

python

import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, measure# 读取图像
image = io.imread('morphplane.jpg')
plt.imshow(image)
plt.title('原始图片')
plt.show()# 图像二值化处理
bw = color.rgb2gray(image) > 0.5# 提取边界
boundaries = measure.find_boundaries(1 - bw)# 获取边界链码
chain = []
startpoints = []for boundary in measure.find_contours(boundaries, 0.5):startpoint = boundary[0].astype(int)startpoints.append(startpoint)chain_segment = []for i in range(len(boundary)-1):y = boundary[i+1, 0] - boundary[i, 0]x = boundary[i+1, 1] - boundary[i, 1]candidate = np.array([[0, 1], [-1, 1], [-1, 0], [-1, -1], [0, -1], [1, -1], [1, 0], [1, 1]])pos = np.where((candidate == [y, x]).all(axis=1))[0][0]chain_segment.append(pos)chain.append(chain_segment)# 显示边界链码
fig, ax = plt.subplots()
ax.imshow(boundaries)
ax.set_title('边界链码')
for i in range(len(startpoints)):startpoint = startpoints[i]ax.plot(startpoint[1], startpoint[0], 'r*', markersize=12)boundary = chain[i]y, x = startpointfor j in range(len(boundary)):candidate = np.array([[y, x+1], [y-1, x+1], [y-1, x], [y-1, x-1], [y, x-1], [y+1, x-1], [y+1, x], [y+1, x+1]])next_point = candidate[boundary[j]]x, y = next_pointax.plot(x, y, 'g.')plt.show()

(2)傅里叶描绘子

A:概述

傅里叶描绘子:是一种常用于形状描述和图像处理的数学方法。它利用傅里叶变换的思想,将一个封闭曲线或轮廓分解为一系列频谱成分,从而对形状进行表示和比较。傅里叶描绘子的基本原理是将曲线表示为一系列复数,每个复数代表了曲线上的一个点。通过对这些复数进行傅里叶变换,可以得到频谱信息。在傅里叶变换中,高频成分表示了曲线的细节和局部特征,低频成分表示了曲线的整体形状。其计算步骤如下

  • 对封闭曲线或轮廓进行采样,获取一系列坐标点
  • 将坐标点转换为复数形式,即将每个点的 x x x y y y坐标看作是实部和虚部构成的复数
  • 对复数序列进行离散傅里叶变换(DFT),得到频域表示
  • 根据需要选择保留的频率成分,可以通过截断高频成分来降低数据量或者提取感兴趣的特征
  • 对保留的频率成分进行逆傅里叶变换(IDFT),得到原始坐标点的复数表示
  • 将复数表示转换为实部和虚部,得到重建后的坐标点

通过傅里叶描绘子,可以对形状进行压缩、匹配和比较。由于傅里叶变换具有平移、旋转和尺度不变性,因此傅里叶描绘子也具有这些不变性,使得它在形状识别、目标跟踪和图像检索等领域有广泛应用

B:程序

如下,分割图像,计算各区域边界点的傅里叶描绘子并重建边界

在这里插入图片描述


matlab

Image=rgb2gray(imread('bricks.jpg'));
figure,imshow(Image),title('原始图像');
T=graythresh(Image);                     %获取阈值T
result=im2bw(Image,T);                   %二值化图像
S=zeros(size(Image));
[B,L]=bwboundaries(1-result);
for k=1:length(B) N=length(B{k});if N/2~=round(N/2)B{k}(end+1,:)=B{k}(end,:);N=N+1;endz=B{k}(:,2)+1i*B{k}(:,1);    for m=[N/2 N*24/32 N*60/64 N*126/128]Z=fft(z);[Y,I]=sort(abs(Z));for count=1:mZ(I(count))=0;endzz=ifft(Z);figure,imshow(S);hold on;plot(real(zz),imag(zz),'w');end
end

python

import numpy as np
import matplotlib.pyplot as plt
from skimage import io, color, filters# 读取图像并转为灰度图像
image = color.rgb2gray(io.imread('bricks.jpg'))
plt.imshow(image, cmap='gray')
plt.title('原始图像')
plt.show()# 二值化图像
threshold = filters.threshold_otsu(image)
result = image > threshold# 初始化画布
S = np.zeros_like(image)# 获取边界
boundaries = color.label2rgb(result, image, kind='overlay')
contours = measure.find_contours(result, 0.5)# 绘制傅里叶描绘子
for contour in contours:N = len(contour)if N % 2 != 0:contour = np.append(contour, [contour[-1]], axis=0)N += 1z = contour[:, 1] + 1j * contour[:, 0]for m in [N/2, N*24/32, N*60/64, N*126/128]:Z = np.fft.fft(z)I = np.argsort(np.abs(Z))for count in range(int(m)):Z[I[count]] = 0zz = np.fft.ifft(Z)plt.imshow(S, cmap='gray')plt.hold(True)plt.plot(np.real(zz), np.imag(zz), 'w')plt.show()

二:矩描述

(1)矩

A:几何矩

几何矩:是一种用于描述图像或形状的数学特征。它们通过对图像或形状的像素值及其位置进行加权求和来计算,提供了关于形状的位置、大小、方向以及形态特征的信息。几何矩的计算基于图像或形状的二维坐标系,并使用不同的权重函数来表示不同的特征

  • 一阶几何矩:是形状的质心(centroid),它表示形状的位置信息
  • 二阶几何矩:包括中心距(central moments),可以获得形状的尺寸和形态特征,例如面积、面积矩、最大、最小轴长和方向等
  • 三阶几何矩和高阶几何矩:提供了更丰富的形态信息,如形状的对称性、弯曲程度等

几何矩计算公式如下

  • 零阶几何矩(面积) M 00 = ∑ ∑ I ( x , y ) M_{00} = \sum \sum I(x, y) M00=∑∑I(x,y)
  • 一阶几何矩(质心) M 10 = ∑ ∑ x ⋅ I ( x , y ) , M 01 = ∑ ∑ y ⋅ I ( x , y ) M_{10} = \sum \sum x \cdot I(x, y), \quad M_{01} = \sum \sum y \cdot I(x, y) M10=∑∑xI(x,y),M01=∑∑yI(x,y)
  • 二阶几何矩(中心矩) μ 20 = ∑ ∑ ( x − x c ) 2 ⋅ I ( x , y ) , μ 02 = ∑ ∑ ( y − y c ) 2 ⋅ I ( x , y ) , μ 11 = ∑ ∑ ( x − x c ) ( y − y c ) ⋅ I ( x , y ) \mu_{20} = \sum \sum (x - x_c)^2 \cdot I(x, y), \quad \mu_{02} = \sum \sum (y - y_c)^2 \cdot I(x, y), \quad \mu_{11} = \sum \sum (x - x_c)(y - y_c) \cdot I(x, y) μ20=∑∑(xxc)2I(x,y),μ02=∑∑(yyc)2I(x,y),μ11=∑∑(xxc)(yyc)I(x,y)

B:不变矩组

不变矩组:是一种用于图像处理和模式识别的特征描述方法。它基于几何矩的概念,通过对图像或形状的几何矩进行归一化和旋转不变性的处理,生成一组具有唯一性和稳定性的特征向量,用于表示和比较图像或形状。计算步骤如下

  • 将图像或形状转换为灰度图像,并对其进行二值化处理
  • 计算二值化图像的几何矩,包括零阶、一阶和二阶矩
  • 根据几何矩计算归一化中心矩,将几何矩除以零阶矩的幂次来消除尺度的影响
  • 根据归一化中心矩计算不变矩,通过对几何矩进行线性组合和归一化得到一组不变矩
  • 对不变矩进行平移、旋转和缩放等操作,使其具有平移和旋转不变性

(2)与矩相关的特征

A:二阶矩

二阶矩:也称为方差(Variance),是统计学中常用的描述数据分布离散程度的指标。在图像处理和模式识别中,二阶矩被广泛应用于描述图像的纹理特征和灰度分布特性。对于一维数据集,二阶矩定义为每个数据点与数据集均值之差的平方的平均值。对于二维数据集或图像,二阶矩是对数据点与数据集均值之差的平方的期望

{ M 20 = ∑ x = 0 M − 1 ∑ y = 0 N − 1 x 2 f ( x , y ) M 02 = ∑ x = 0 M − 1 ∑ y = 0 N − 1 y 2 f ( x , y ) \left\{\begin{array}{l}M_{20}=\sum_{x=0}^{M-1} \sum_{y=0}^{N-1} x^{2} f(x, y) \\M_{02}=\sum_{x=0}^{M-1} \sum_{y=0}^{N-1} y^{2} f(x, y)\end{array}\right. {M20=x=0M1y=0N1x2f(x,y)M02=x=0M1y=0N1y2f(x,y)

B:主轴

主轴:是指图形、形状或区域的特征轴线,它描述了形状的主要方向和旋转情况。主轴通常使用惯性矩阵来计算,通过分析图像或形状在不同方向上的质量分布来确定主轴的方向和长度

在这里插入图片描述

C:等效椭圆

等效椭圆:是用于描述图形或形状的一种几何模型,它能够近似地表示原始图形的外形和尺寸。等效椭圆通常是通过对图形的边界进行拟合得到的,使得椭圆与图形的形状最相似

{ a = [ 2 ( μ 20 + μ 02 + ( μ 20 − μ 02 ) 2 + 4 μ 11 2 ) 1 2 μ 00 ] 1 2 ] 1 2 b = [ 2 ( μ 20 + μ 02 − ( μ 20 − μ 02 ) 2 + 4 μ 11 2 μ 00 ] 1 2 \left\{\begin{array}{l}\left.a=\left[\frac{2\left(\mu_{20}+\mu_{02}+\sqrt{\left(\mu_{20}-\mu_{02}\right)^{2}+4 \mu_{11}^{2}}\right)^{\frac{1}{2}}}{\mu_{00}}\right]^{\frac{1}{2}}\right]^{\frac{1}{2}} \\b=\left[\frac{2\left(\mu_{20}+\mu_{02}-\sqrt{\left(\mu_{20}-\mu_{02}\right)^{2}+4 \mu_{11}^{2}}\right.}{\mu_{00}}\right]^{\frac{1}{2}}\end{array}\right. a=[μ002(μ20+μ02+(μ20μ02)2+4μ112 )21]21 21b=[μ002(μ20+μ02(μ20μ02)2+4μ112 ]21

D:偏心率

偏心率:是描述椭圆形状的一个指标,它表示椭圆离开圆形的程度。偏心率越接近于0,表示椭圆形状越接近于圆形;而偏心率越接近于1,表示椭圆形状越拉长。在几何学中,偏心率可以通过椭圆的焦点和半长轴之间的比例来定义

e = a b e=\frac{a}{b} e=ba

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

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

相关文章

SpringBoot-学习笔记(基础)

文章目录 1. 概念1.1 SpringBoot快速入门1.2 SpringBoot和Spring对比1.3 pom文件坐标介绍1.4 引导类1.5 修改配置1.6 读取配置1.6.1 读取配置信息1.6.2 读取配置信息并创建类进行封装 1.7 整合第三方技术1.7.1 整合JUnit1.7.1 整合Mybatis1.7.1 整合Mybatis-Plus1.7.1 整合Drui…

又一关键系统上线,理想车云和自动驾驶系统登陆OceanBase

8 月 1 日,理想汽车公布 7 月交付数据,理想汽车 2023 年 7 月共交付新车 34,134 辆,同比增长 227.5%,并已连续两个月交付量突破三万。至此,理想汽车 2023 年累计交付量已经达到 173,251 辆,远超 2022 年全年…

K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(下)

温故知新 📚第三章 Kubernetes各组件部署📗安装kubectl(可直接跳转到安装kubeadm章节,直接全部安装了)📕下载kubectl安装包📕执行kubectl安装📕验证kubectl 📗安装kubead…

FLASH读写数据

目录 嵌入式 Flash大概了解 数据手册2.3.2章节 结构图f407 等待周期 Flash 控制寄存器解锁 编程/擦除并行位数 擦除 编程(写入) 工程程序 嵌入式 Flash大概了解 可以从flash区域启动程序;大概是程序区可以在flash,所以是可以…

JavaScript实现系统级别的取色器、EyeDropper、try、catch、finally

文章目录 效果图htmlJavaScript关键代码EyeDroppertry...catch颜色值相减(色差)的传送门 效果图 html <div class"d_f fd_c ai_c"><button id"idBtn" class"cursor_pointer">开始取色</button><div id"idBox" c…

PocketMiner:基于深度学习发现蛋白的隐式口袋

文章目录 1. 文章简介2. 前言3. 方法3.1 模型框架 4. 结果4.1 已知隐式口袋在分子动力学模拟分析迅速打开4.2 图神经网络模型能够准确预测模拟中口袋的动态变化4.3 隐式口袋数据集数据集揭示了新的隐式口袋形成的模式4.4 PocketMiner能够从无配体的蛋白结构中精准预测预测口袋4…

TBOX开发需求说明

TBOX功能需求&#xff1a; 支持4G上网功能&#xff0c;可获取外网IP&#xff0c;可和云端平台连通支持路由功能&#xff0c;支持计算平台、网关和云端平台建立网络连接支持USB转网口&#xff0c;智能座舱会通过USB连接AG35建立网络连接&#xff08;类似IVI通过USB口连接TBOX&a…

linux中dmesg命令用法

在Linux系统中&#xff0c;dmesg&#xff08;diagnostic message&#xff09;是一个非常有用的命令行工具&#xff0c;用于显示和控制内核环形缓冲区中的消息。这些消息通常包含系统启动时的内核生成的信息&#xff0c;例如硬件设备的状态&#xff0c;驱动程序的加载&#xff0…

浅析Linux SCSI子系统:错误恢复

文章目录 概述SCSI错误恢复处理添加错误恢复命令错误恢复线程scsi_eh_ready_devs IO超时处理相关参考 概述 IO路径是一个漫长的过程&#xff0c;从SCSI命令请求下发到请求完成返回&#xff0c;中间的任何一个环节出现问题都会导致IO请求的失败。从SCSI子系统到低层驱动&#x…

【云原生】Ansible自动化批量操作工具playbook剧本

目录 1.playbook相关知识 1.1 playbook 的简介 1.2 playbook的 各部分组成 2. 基础的playbook剧本编写实例 2.1 playbook编写Apache安装剧本&#xff08;yum方式安装&#xff09; 报错集&#xff1a; 实例2&#xff1a;playbook编写nginx 的yum安装并且能修改其监听端口的…

认识JVM的内存模型

从上一节了解到整个JVM大的内存区域&#xff0c;分为线程共享的heap&#xff08;堆&#xff09;&#xff0c;MethodArea&#xff08;方法区&#xff09;&#xff0c;和线程独享的 The pc Register&#xff08;程序计数器&#xff09;、Java Virtual Machine Stacks&#xff08;…

MVC,MVP,MVVM的理解和区别

MVC MVC &#xff0c;早期的开发架构&#xff0c;在安卓里&#xff0c;用res代表V&#xff0c;activity代表Controller层&#xff0c;Model层完成数据请求&#xff0c;更新操作&#xff0c;activity完成view的绑定&#xff0c;以及业务逻辑的编写&#xff0c;更新view&#xf…

Jenkins java8安装版本安装

一、首先准备Jenkins、Jdk8、Tomcat9安装包 根据Jenkins官网介绍&#xff0c;Jenkins支持Java8的版本如下&#xff1a; 我们选择2.164版本进行安装&#xff0c;根据版本号支持输入下载地址&#xff1a;https://archives.jenkins.io/war/2.164/jenkins.war&#xff0c;进行下载…

Mybatis 插入、修改、删除

前面几篇我们介绍了使用Mybatis查询数据&#xff0c;并且也了解了如何在Mybatis中使用JDK的日志系统打印日志&#xff1b;本篇我们继续介绍如何使用Mybatis完成数据的插入、修改和删除。 如果您对查询数据和Mybatis集成JDK日志系统不太了解&#xff0c;建议您先进行了解后再阅…

【Vue CLI】

node.js安装 https://nodejs.org/download/release/v15.14.0/ 管理员运行cmd node -v 安装npm npm install -g cnpm --registryhttps://registry.npm.taobao.org 查看是否安装成功 npm -v 注册淘宝镜像加速器 npm config set registry https://registry.npm.taobao.org/ 查看…

Vue2项目练手——通用后台管理项目第二节

Vue2项目练手——通用后台管理项目 路由限制重复跳转CommonAside.vue 顶部header组件搭建与样式修改右边用户菜单栏使用的组件图片CommonHeader.vue Vuex实现左侧折叠文件目录store/index.jsstore/tab.jsmain.jsCommonHeader.vueCommonAside.vueMain.vue 路由限制重复跳转 路由…

Qt使用Json

包含目录&#xff1a; #include <QJsonObject> #include <QJsonDocument> #include <QByteArray> #include <QFile> #include <QJsonArray>基本结构&#xff1a; 写json QJsonObject studentobj;QJsonArray arrarydata;QJsonObject subdata;…

50ETF期权开户平台(0门槛期权开户指南)

50ETF期权开户平台比较好的有&#xff1a;期权馆&#xff0c;期权科普馆&#xff0c;小熊期权&#xff0c;期权酱&#xff0c;财顺财经&#xff0c;财顺期权等&#xff0c;都是国内前十的期权分仓平台&#xff0c;下文为大家结算50ETF期权开户平台&#xff08;0门槛期权开户指南…

HTTP介绍:一文了解什么是HTTP

前言&#xff1a; 在当今数字时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。无论是浏览网页、发送电子邮件还是在线购物&#xff0c;我们都离不开超文本传输协议&#xff08;HTTP&#xff09;。HTTP作为一种通信协议&#xff0c;扮演着连接客户端和服务器的重要角…

微信小程序新版隐私协议弹窗实现最新版

1. 微信小程序又双叒叕更新了 2023.08.22更新&#xff1a; 以下指南中涉及的 getPrivacySetting、onNeedPrivacyAuthorization、requirePrivacyAuthorize 等接口目前可以正常接入调试。调试说明&#xff1a; 在 2023年9月15号之前&#xff0c;在 app.json 中配置 __usePriva…