计算机视觉--距离变换算法的实战应用
前言:
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)。 填写项目名称,并选择项目保存的路径,然后点击创建。 创建完成后,会自动生成如下所示文件,可以根据…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...