当前位置: 首页 > news >正文

计算机视觉--距离变换算法的实战应用

在这里插入图片描述

前言: Hello大家好,我是Dream。 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中,我们将使用D4距离度量方法来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算机视觉和图像处理有了更深入的了解。让我们一起来看看实际的计算结果和可视化效果吧!

距离变换是一种常用的方法,它可以帮助我们计算出每个像素点与最近的前景像素点之间的距离。这对于图像分析、目标检测和图像配准等任务至关重要。D4距离定义为两个像素点之间在水平和垂直方向上的绝对距离之和。通过这种度量方式,我们可以获得每个像素点到最近的前景像素点的距离。为了测试距离变换的效果,我们首先随机生成了一张8*8大小的图像,并随机选取了其中的10个像素点作为前景像素。前景像素用1表示,背景像素用0表示。接下来,我们实现了一个距离函数,用于计算两个像素点之间的D4距离。然后,我们通过遍历图像中的每个像素点,计算其与与其最近的前景像素点的距离,并将结果保存到一个距离矩阵中。最后,我们将原始图像和距离变换后的结果进行可视化展示。使用灰度图像表示原始图像,黑色像素点表示随机生成的前景像素点。而距离变换结果则使用“cool”颜色映射进行显示,较远的像素点呈现较浅的颜色,较近的像素点呈现较深的颜色。

1. 导入必要的库

首先,我们需要导入必要的库,NumPy和Matplotlib库。

import numpy as np
import matplotlib.pyplot as plt

2. 生成随机图像,定义距离度量

随机生成 0/1 像素值的图片,大小为 8*8,0 为背景像素,1 为前景像素

image = np.random.randint(2, size=(8, 8))
print('原始图片:\n', image)

在这里插入图片描述
随机选取 10 个前景像素:

for i in range(10):x, y = np.random.randint(8, size=2)image[x, y] = 1print('选取前景像素后的图片:\n', image)

选取前景像素后的图片:
[[1 0 1 1 0 1 0 1]
[0 1 1 0 1 0 0 0]
[1 1 1 1 1 1 0 1]
[0 0 1 0 1 0 1 0]
[0 1 1 0 0 1 0 1]
[0 1 1 1 1 1 1 1]
[1 1 1 1 1 0 1 1]
[0 1 0 1 0 0 1 1]]

3. 进行距离变换

D4距离介绍: 像素p(x,y)和q(s,t)之间的D4距离定义为: = |x – s| + |y – t|
D4距离变换算法是一种常用的图像处理算法,用于计算图像中像素点与最近的前景像素点之间的距离。
在D4距离变换算法中,D4代表了四邻域距离度量。它仅考虑像素点之间在水平和垂直方向上的差异,而忽略了对角线方向上的差异

算法步骤如下:

  1. 初始化一个与原始图像大小相同的距离矩阵,其中所有背景像素点的距离值为0。
  2. 从图像中选择一个前景像素点作为起点。
  3. 遍历图像中的每个背景像素点,并计算其到起点像素点的D4距离。
  4. 比较当前像素点与起点之间的距离与之前计算得到的最小距离,如果当前距离更小,则更新该像素点的距离值为当前距离。
  5. 重复第3步和第4步,直到遍历完所有的背景像素点。
  6. 选择下一个前景像素点作为起点,重复以上步骤,直到遍历完所有的前景像素点。
  7. 最终得到的距离矩阵即为距离变换后的结果,其中每个像素点的距离值表示该像素点到离它最近的前景像素点的距离。

定义距离函数

def dist(p1, p2, metric='D4'):if metric == 'D4':return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])elif metric == 'D8':return max(abs(p1[0] - p2[0]), abs(p1[1] - p2[1]))

生成距离矩阵

matrix = np.zeros_like(image)
for i in range(image.shape[0]):for j in range(image.shape[1]):# 背景像素的距离为 0if image[i, j] == 0:matrix[i, j] = 0else:  # 初始化为一个巨大的数字min_dist = 99999           for m in range(image.shape[0]):for n in range(image.shape[1]):# 只计算背景像素的距离if image[m, n] == 0:d = dist((i, j), (m, n), metric='D4')if d < min_dist:min_dist = dmatrix[i, j] = min_distprint('距离变换后的结果:\n', matrix)

距离变换后的结果:
[[1 0 1 1 0 1 0 1]
[0 1 1 0 1 0 0 0]
[1 1 2 1 2 1 0 1]
[0 0 1 0 1 0 1 0]
[0 1 1 0 0 1 0 1]
[0 1 2 1 1 1 1 2]
[1 2 1 2 1 0 1 2]
[0 1 0 1 0 0 1 2]]

4. 可视化处理

在这里,我们使用灰度图像表示原始图像,黑色像素点表示随机生成的像素点。使用“cool”颜色映射可视化距离变换的结果。
Original Image

plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()

在这里插入图片描述
Distance Transformed Image

plt.imshow(matrix, cmap='cool')
plt.title('Distance Transformed Image')
plt.colorbar()
plt.show()

在这里插入图片描述
本文介绍了计算机视觉中的距离度量,并使用随机生成的像素点进行了测试,并对计算结果进行了可视化展示。下面我会继续扩充一下这篇文章。

5. 结果分析

通过上述代码,我们可以得到距离变换后的结果。在结果中,黑色像素点表示随机生成的前景像素点,其他颜色表示每个像素点到最近的前景像素点的距离。我们可以看到,距离变换后的图像可以清晰地展示出各个像素点到前景像素点的距离信息。较远的像素点呈现较浅的颜色,而较近的像素点呈现较深的颜色。

总结

距离度量在计算机视觉CV领域有着广泛的应用。如图像分割、图像配准、目标检测和目标跟踪等任务中,都需要计算像素之间的距离来对图像进行处理和分析。而距离变换则可以帮助我们更好地理解像素之间的关系和结构,并为后续的图像处理工作提供基础和参考。

本期推荐:
Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作(上下册)
在这里插入图片描述

相关文章:

计算机视觉--距离变换算法的实战应用

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中&#xff0c;我们将使用D4距离度量方法来对图像进行处理。通过这次实验&#xff0c;我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算…...

MIT 6.824 -- MapReduce -- 01

MIT 6.824 -- MapReduce -- 01 引言抽象和实现可扩展性可用性(容错性)一致性MapReduceMap函数和Reduce函数疑问 课程b站视频地址: MIT 6.824 Distributed Systems Spring 2020 分布式系统 推荐伴读读物: 极客时间 – 大数据经典论文解读DDIA – 数据密集型应用大数据相关论文…...

概念解析 | 利用IAA迭代自适应方法实现高精度角度估计

利用IAA迭代自适应方法实现高精度角度估计 注1:本文系“概念辨析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:IAA迭代自适应方法在雷达角度估计中的应用。 背景介绍 在雷达目标检测与定位中,准确估计目标角度是实现高精度定位的关键。传统的基于…...

正则表达式必知必会

文章目录 前言匹配单个字符匹配任意字符匹配一组字符取非匹配元字符匹配数字匹配所有字母和数字匹配空白字符重复匹配避免过度匹配边界匹配字符串边界子表达式回溯引用回溯引用中的替换操作向前查找向后查找 前言 在工作中使用正则表达式可以提高我们的效率&#xff0c;这篇博…...

[SQL系列] 从头开始学PostgreSQL 分库分表

什么是分库分表 分库分表是一种数据库架构设计的方法&#xff0c;用于应对大规模数据的存储和查询。当单个数据库的存储容量或查询性能无法满足需求时&#xff0c;可以通过将数据分散存储在多个数据库服务器上&#xff0c;以提高系统的可扩展性和性能。 分库分表通常包…...

【VScode】Remote-SSH XHR failed无法访问远程服务器

问题概述 当使用VScode连接远程服务器时&#xff0c;往往需要使用Remote-SSH这个插件。而该插件有一个小bug&#xff0c;当远程服务器网络不佳时容易出现。 在控制台会出现下述语句&#xff1a; Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/…...

pycharm打开terminal报错

Pycharm打开终端报错如何解决&#xff1f;估计是终端启动conda不顺利&#xff0c;需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell&#xff0c;才可以使用conda环境 W…...

C#与C/C++交互(1)——需要了解的基础知识

【前言】 C#中用于实现调用C/C的方案是P/Invoke&#xff08;Platform Invoke&#xff09;&#xff0c;让托管代码可以调用库中的函数。类似的功能&#xff0c;JAVA中叫JNI&#xff0c;Python中叫Ctypes。 常见的代码用法如下&#xff1a; [DllImport("Test.dll", E…...

LeetCode笔记:Weekly Contest 356

LeetCode笔记&#xff1a;Weekly Contest 356 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接&#xff1a;https://leetcode.com/contest/weekly-contest-356/ 1. 题目一…...

2 Python的基础语法

概述 在上一节的内容中&#xff0c;我们介绍了Python的诞生、发展历程、特色、缺点和应用领域。从本节开始&#xff0c;我们将正式学习Python。Python是一门简洁和优雅的语言&#xff0c;有自己特殊的一些语法规则。因此&#xff0c;在介绍Python编程的有关知识之前&#xff0c…...

抖音seo矩阵系统源代码开发搭建技术分享

抖音SEO矩阵系统是一个较为复杂的系统&#xff0c;其开发和搭建需要掌握一定的技术。以下是一些技术分享&#xff1a; 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中&#xff0c;JAVA语言的应用较为广泛&#xff0c;因为JAVA语言有良好…...

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…...

记RT-Thread rt_timer_start函数的问题

我使用的RT-Thread版本为4.0.3。 我看了5.0.1的代码&#xff0c;此问已经被修复。 在4.0.3版本中的rt_timer_start函数源码如下&#xff1a; rt_err_t rt_timer_start(rt_timer_t timer) {unsigned int row_lvl;rt_list_t *timer_list;register rt_base_t level;rt_list_t *r…...

C++初阶——拷贝构造和运算符重载(const成员)

目录 1. 拷贝构造函数 1.2 拷贝构造函数特征&#xff1a; 2. 默认拷贝构造函数 2.1 未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝&#xff0c;这种拷贝叫做浅拷贝&#xff0c;或者值拷贝 3. 运算符重载 3.1…...

go练习 day01

DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…...

C# Blazor 学习笔记(0.1):如何开始Blazor和vs基本设置

文章目录 前言资源推荐环境如何开始Blazor个人推荐设置注释快捷键热重载设置 前言 Blazor简单来说就是微软提供的.NET 前端框架。使用 WebAssembly的“云浏览器”&#xff0c;集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …...

原码的乘法运算 补码乘法运算

补码乘法 对比...

找不到d3dx9_43.dll丢失怎么解决(分享几种解决方法)

为什么我们打开电脑软件或许游戏时候&#xff0c;电脑会报错出现d3dx9_43.dll丢失&#xff0c;或许找不到d3dx9_43.dll等等的提示。下面来详细介绍一下d3dx9_43.dll详细解决方法跟d3dx9_43.dll是什么。 如果你的系统中没有安装或安装不完整的d3dx9_43.dll运行时&#xff0c;应…...

篇四:建造者模式:逐步构造复杂对象

篇四&#xff1a;“建造者模式&#xff1a;逐步构造复杂对象” 设计模式是软件开发中的重要组成部分&#xff0c;建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象&#xff0c;将对象的构造与其表示分离&#xff0c;从而使得同样的构建过程可以创建不同的…...

vs导出和导入动态库和静态库

1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目&#xff0c;选择动态链接库&#xff08;DLL&#xff09;。 填写项目名称&#xff0c;并选择项目保存的路径&#xff0c;然后点击创建。 创建完成后&#xff0c;会自动生成如下所示文件&#xff0c;可以根据…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...