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

news2024/10/6 2:26:29

文章目录

  • 一:边界描述
    • (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:len
    boundary=B{i};
    everylen=length(boundary);
    startpoint(i,:)=boundary(1,:);
    for j=1:everylen-1
        candidate=[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:len
    x=startpoint(i,2);
    y=startpoint(i,1);
    plot(x,y,'r*','MarkerSize',12);
    boundary=chain{i};
    everylen=length(boundary);
    for j=1:everylen
        candidate=[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 = startpoint
    
    for 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_point
        ax.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;
    end
    z=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:m
            Z(I(count))=0;
        end
        zz=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 += 1
    
    z = 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]] = 0
        
        zz = 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.coloradmin.cn/o/963966.html

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

相关文章

软件测试Day5|软件测试理论03

白盒测试方法 针对程序的代码进行测试,代码覆盖率高;缺点:覆盖所有代码路径大、业务功能可能覆盖不全、测试开销大 静态方法:1)桌面检查(一个人检查);2)代码审查&#…

音频——硬件拓扑

文章目录 硬件拓扑I2S 数据通路五线模式四线模式两线 TX两线 RX 典型应用硬件连接数据流 硬件拓扑 控制路径:UART/I2C/SPI数据路径:I2S 简略图如下 I2S 数据通路 五线模式 四线模式 两线 TX 两线 RX 典型应用 硬件连接 控制信号:SPI 用…

网络通讯接收组播异常问题技术分析报告

1、问题概述 2023年8月24日,深夜约22:10分,内部网络E5刀片上运行的组播接收软件未收到目的地址是230.1.6.4的航迹组播报文,利用交换机Web页面查看交换机组播表项,发现E5刀片连接的交换机29端口没有任何组播表项。重新运行组播接收…

每日一题 2511. 最多可以摧毁的敌人城堡数目

难度:简单 翻译:寻找距离最远的 1 和 -1 的组合,要求它们之间只有0 class Solution:def captureForts(self, forts: List[int]) -> int:res, t 0, -1for i, fort in enumerate(forts):if fort -1 or fort 1:if t > 0 and fort ! f…

687. 最长同值路径

687. 最长同值路径 C代码:DFS int res; // int res 0; 这种初始化有问题int dfs(struct TreeNode* root, int val) {if (root NULL) {return 0;}int left dfs(root->left, root->val);int right dfs(root->right, root->val);res fmax(res, lef…

【STM32】学习笔记(TIM定时器)

TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断功能,而且…

nvidia-smi nvcc -V 及 CUDA、cuDNN 安装

nvidia-smi nvcc -V 及 CUDA、cuDNN 安装 1. 问题缘由2. 分析3. CUDA Driver API 安装3.1 Software & Updates3.2 官网下载 4. CUDA Runtime API 安装5. 安装 cuDNN5.1 cuDNN下载 6. 一点点小注意事项 1. 问题缘由 之前查找 CUDA 版本时都是直接使用的 nvidia-smi 指令&am…

软考A计划-网络工程师-复习背熟-数据通信基础和局域网技术

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

Power View

界面 切换可视化效果 对于已经上传到透视表的数据,选择power view,形成表格后。

Windows开发调试纯Linux代码(WSL+Qt+MobaXterm)环境搭建(超详细教程)

为何要调试Linux代码 1 学习Linux环境开发 想必很多同学都想学习Linux环境下的开发,一个是很多纯服务端程序不需要Windows这样的窗口界面。另一个纯服务端开发Linux的命令行以及脚本优势也比较明显。相反,Windows在纯服务端编程方面并没有Linux有优势。…

拓扑排序算法 -- dfs、bfs

210. 课程表 II 该题用到「拓扑排序」的算法思想,关于拓扑排序,直观地说就是,让你把⼀幅图「拉平」,⽽且这个「拉平」的图⾥⾯,所有箭头⽅向都是⼀致的,⽐如上图所有箭头都是朝右的。 很显然,如…

CVE-2023-32315:Openfire管理控制台身份验证绕过到RCE的复现

CVE-2023-32315:Openfire管理控制台身份验证绕过到RCE复现 前言 本次测试仅供学习使用,如若非法他用,与本文作者无关,需自行负责!!! 一.Openfire简介 Openfire是根据开源Apache许可证授权的…

C语言——指针基本语法

概述 内存地址 在计算机内存中,每个存储单元都有一个唯一的地址(内存编号)。 通俗理解,内存就是房间,地址就是门牌号 指针和指针变量 指针(Pointer)是一种特殊的变量类型,它用于存储内存地址。 指针的实…

46、SpringBoot输入校验--JSR 303

★ Spring Boot的输入校验 springboot支持两种校验方式:1. Spring原生提供的 Validation,这种验证方式需要开发者手写验证代码,比较繁琐。就是普通的if判断2. 使用JSR 303的校验,这种验证方式只需使用注解、即可以声明式的方式进…

封装(个人学习笔记黑马学习)

1、格式 #include <iostream> using namespace std;const double PI 3.14;//设计一个圆类&#xff0c;求圆的周长 class Circle {//访问权限//公共权限 public://属性//半径int m_r;//行为//获取圆的周长double calculateZC() {return 2 * PI * m_r;} };int main() {//通…

MBA/MEM联考已经过了“蛮干”的时间段了……

如果MBA/MEM备考存在有效的方式&#xff0c;倾注时间一定是最靠谱的&#xff01;如果要靠谱的一点的方式&#xff0c;那就是大量的倾注时间&#xff01;可问题目前已经没有“大量”的时间可以用了&#xff0c;因为对于在职考生而言&#xff0c;最难得得也恰恰就是时间&#xff…

软件总体部署:Total Software Deployment Crack

TNI 6.1&#xff1a;数据传输模式的新界面和功能 根据您向支持团队提供的反馈&#xff0c;我们对“数据传输”窗口的机制和界面进行了重大重新设计。 概述 远程和自动化软件部署 全面软件部署&#xff1a;企业网络的托管软件部署。 远程和自动化软件部署 Total Software Deplo…

碳中和数据合集(含上市公司碳排放、碳减排、排污费、环境税等数据)1990-2022年

数据简介&#xff1a;“推动企业形成绿色生产方式和生活方式”“支持有条件的地方和重点行业、重点企业率先达到碳排放峰值”。可见&#xff0c;企业已成为应对气候变化、推动低碳转型、助力“双碳”目标实现的主力军&#xff0c;推动其绿色、低碳化转型已成为未来经济发展的必…

OpenCV(十三):图像中绘制直线、圆形、椭圆形、矩形、多边形和文字

目录 1.绘制直线line() 2.绘制圆形circle() 3.绘制椭圆形ellipse() 4.绘制矩形rectangle() 5.绘制多边形 fillPoly() 6.绘制文字putText() 7.例子 1.绘制直线line() CV_EXPORTS_W void line(InputOutputArray img,Point pt1, Point pt2,const Scalar& color,int t…

“宽带中国”城市试点与专利匹配数据,做一个多期DID(2010-2021)

数据简介&#xff1a;人类正在经历以互联网为基础的第三次技术革命&#xff0c;作为以“互联网”为底层基础的数字经济&#xff0c;以5G、人工智能和大数据中心为代表的数字基础设施建设和普惠宽带网络基础设施建设成为数字经济可持续发展的动力。工业和信息化部、国家发展和改…