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

前言: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代表了四邻域距离度量。它仅考虑像素点之间在水平和垂直方向上的差异,而忽略了对角线方向上的差异。
算法步骤如下:
- 初始化一个与原始图像大小相同的距离矩阵,其中所有背景像素点的距离值为0。
- 从图像中选择一个前景像素点作为起点。
- 遍历图像中的每个背景像素点,并计算其到起点像素点的D4距离。
- 比较当前像素点与起点之间的距离与之前计算得到的最小距离,如果当前距离更小,则更新该像素点的距离值为当前距离。
- 重复第3步和第4步,直到遍历完所有的背景像素点。
- 选择下一个前景像素点作为起点,重复以上步骤,直到遍历完所有的前景像素点。
- 最终得到的距离矩阵即为距离变换后的结果,其中每个像素点的距离值表示该像素点到离它最近的前景像素点的距离。
定义距离函数
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版):从零开始教编程小白一键搞定烦琐工作(上下册)
相关文章:
计算机视觉--距离变换算法的实战应用
前言: Hello大家好,我是Dream。 计算机视觉CV是人工智能一个非常重要的领域。 在本次的距离变换任务中,我们将使用D4距离度量方法来对图像进行处理。通过这次实验,我们可以更好地理解距离度量在计算机视觉中的应用。希望大家对计算…...
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迭代自适应方法在雷达角度估计中的应用。 背景介绍 在雷达目标检测与定位中,准确估计目标角度是实现高精度定位的关键。传统的基于…...
正则表达式必知必会
文章目录 前言匹配单个字符匹配任意字符匹配一组字符取非匹配元字符匹配数字匹配所有字母和数字匹配空白字符重复匹配避免过度匹配边界匹配字符串边界子表达式回溯引用回溯引用中的替换操作向前查找向后查找 前言 在工作中使用正则表达式可以提高我们的效率,这篇博…...
[SQL系列] 从头开始学PostgreSQL 分库分表
什么是分库分表 分库分表是一种数据库架构设计的方法,用于应对大规模数据的存储和查询。当单个数据库的存储容量或查询性能无法满足需求时,可以通过将数据分散存储在多个数据库服务器上,以提高系统的可扩展性和性能。 分库分表通常包…...
【VScode】Remote-SSH XHR failed无法访问远程服务器
问题概述 当使用VScode连接远程服务器时,往往需要使用Remote-SSH这个插件。而该插件有一个小bug,当远程服务器网络不佳时容易出现。 在控制台会出现下述语句: Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/…...
pycharm打开terminal报错
Pycharm打开终端报错如何解决?估计是终端启动conda不顺利,需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell,才可以使用conda环境 W…...
C#与C/C++交互(1)——需要了解的基础知识
【前言】 C#中用于实现调用C/C的方案是P/Invoke(Platform Invoke),让托管代码可以调用库中的函数。类似的功能,JAVA中叫JNI,Python中叫Ctypes。 常见的代码用法如下: [DllImport("Test.dll", E…...
LeetCode笔记:Weekly Contest 356
LeetCode笔记:Weekly Contest 356 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-356/ 1. 题目一…...
2 Python的基础语法
概述 在上一节的内容中,我们介绍了Python的诞生、发展历程、特色、缺点和应用领域。从本节开始,我们将正式学习Python。Python是一门简洁和优雅的语言,有自己特殊的一些语法规则。因此,在介绍Python编程的有关知识之前,…...
抖音seo矩阵系统源代码开发搭建技术分享
抖音SEO矩阵系统是一个较为复杂的系统,其开发和搭建需要掌握一定的技术。以下是一些技术分享: 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中,JAVA语言的应用较为广泛,因为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的代码,此问已经被修复。 在4.0.3版本中的rt_timer_start函数源码如下: 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 拷贝构造函数特征: 2. 默认拷贝构造函数 2.1 未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝 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的“云浏览器”,集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …...
原码的乘法运算 补码乘法运算
补码乘法 对比...
找不到d3dx9_43.dll丢失怎么解决(分享几种解决方法)
为什么我们打开电脑软件或许游戏时候,电脑会报错出现d3dx9_43.dll丢失,或许找不到d3dx9_43.dll等等的提示。下面来详细介绍一下d3dx9_43.dll详细解决方法跟d3dx9_43.dll是什么。 如果你的系统中没有安装或安装不完整的d3dx9_43.dll运行时,应…...
篇四:建造者模式:逐步构造复杂对象
篇四:“建造者模式:逐步构造复杂对象” 设计模式是软件开发中的重要组成部分,建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象,将对象的构造与其表示分离,从而使得同样的构建过程可以创建不同的…...
vs导出和导入动态库和静态库
1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目,选择动态链接库(DLL)。 填写项目名称,并选择项目保存的路径,然后点击创建。 创建完成后,会自动生成如下所示文件,可以根据…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
多模态大语言模型arxiv论文略读(112)
Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题:Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者:Jea…...
spring中的@KafkaListener 注解详解
KafkaListener 是 Spring Kafka 提供的一个核心注解,用于标记一个方法作为 Kafka 消息的消费者。下面是对该注解的详细解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…...
