opencv:距离变换 cv2.distanceTransform

函数 cv2.distanceTransform() 用于计算图像中每一个非零点像素与其最近的零点像素之间的距离(Distance Transform, DT算法),输出的是保存每一个非零点与最近零点的距离信息;图像上越亮的点,代表了离零点的距离越远。
distanceTransformWithLabels 可以返回距离图和标签图。
distance, labels = cv.distanceTransformWithLabels(opn, cv.DIST_L1, 3, labelType=cv.DIST_LABEL_CCOMP)

cv2.distanceTransform(src, 					# 二通道二值图,uint8 格式distanceType, 			# 距离类型maskSize[, 				# 距离变换掩码的大小dst[, dstType]]				# 要生成的标签数组的类型) -> dst

参数
src:这是输入的8位单通道(通常是二值化的)源图像。每个像素值要么是0(背景),要么是255(前景),函数会计算每个前景像素到最近背景像素的距离。

dst:这是输出图像,包含计算出的距离信息。它是一个8位或32位浮点型的单通道图像,与src图像具有相同的尺寸。每个像素值表示该像素到最近的背景像素的距离。

labels:这是输出的二维标签数组(离散的Voronoi图)。它具有CV_32SC1(32位整数)类型,并且与src图像具有相同的尺寸。每个像素值代表了最近的背景像素或背景像素组成的连通组件的标签。

distanceType:这指定了距离类型,它定义了计算距离的方式,具体包括:

  • DIST_L1:城市街区距离,也称为曼哈顿距离。
  • DIST_L2:欧几里得距离。
  • DIST_C:棋盘距离,也称为无限范数距离。

maskSize:这是距离变换所使用的掩模大小。它定义了计算距离时考虑的邻域大小。DIST_MASK_PRECISE在此变体中不受支持。对于DIST_L1或DIST_C距离类型,参数被强制为3,因为3×3的掩模可以给出与5×5或任何更大窗口相同的距离结果。

labelType:这定义了要构建的标签数组的类型,具体包括:

  • DIST_LABEL_CCOMP:每个连通组件的背景像素都被赋予一个唯一的标签。
  • DIST_LABEL_PIXEL:每个背景像素都被赋予一个唯一的标签。

通常,为了快速、粗略的距离估算DIST_L2,使用3×3掩模。为了更精确的距离估算DIST_L2,使用5×5掩模或精确算法。需要注意的是,无论是精确算法还是近似算法,它们的时间复杂度都是与像素数量线性的。

在这里插入图片描述
在这里插入图片描述

distanceTransformWithLabels

import cv2 as cv# 假设 opn 是经过预处理(如形态学开运算)的二值图像
distance, labels = cv.distanceTransformWithLabels(opn, distanceType=cv.DIST_L1,maskSize=3,labelType=cv.DIST_LABEL_CCOMP
)

在这里插入图片描述在这里插入图片描述

经典应用

提取硬币前景

path = "..." # 补充图片路径
img = cv.imread(path, cv.IMREAD_GRAYSCALE)
_ret, img2 = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
kernel = np.ones((3, 3), np.uint8)
opn = cv.morphologyEx(img2, cv.MORPH_OPEN, kernel)
distance = cv.distanceTransform(opn, cv.DIST_L2, 3)
_ret, result = cv.threshold(distance, 0.05 * distance.max(), 255, cv.THRESH_BINARY)plt.subplot(221), plt.imshow(img, cmap='gray'), plt.title('org'), plt.axis('off')
plt.subplot(222), plt.imshow(opn, cmap='gray'), plt.title('opn'), plt.axis('off')
plt.subplot(223), plt.imshow(distance, cmap='gray'), plt.title('distance'), plt.axis('off')
plt.subplot(224), plt.imshow(result, cmap='gray'), plt.title('result'), plt.axis('off')

效果类似于下图

在这里插入图片描述

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

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

相关文章

基于Spring Boot的党员学习交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

自动驾驶两个传感器之间的坐标系转换

有两种方式可以实现两个坐标系的转换。 车身坐标系下一个点p_car,需要转换到相机坐标系下,旋转矩阵R_car2Cam,平移矩阵T_car2Cam。点p_car在相机坐标系下记p_cam. 方法1:先旋转再平移 p_cam T_car2Cam * p_car T_car2Cam 需要注…

k8s ssl 漏洞修复

针对Kubernetes集群中SSL/TLS协议信息泄露漏洞(CVE-2016-2183)的修复,需重点修改涉及弱加密算法的组件配置。以下是具体修复步骤及验证方法: 一、漏洞修复步骤 1. 修复etcd服务 修改配置文件 : 编辑 /etc/kubernetes/…

数字IC后端培训教程| 芯片后端实战项目中base layer drc violation解析

今天分享一个咱们社区IC后端训练营学员遇到的一个经典DRC案例。这个DRC Violation的名字为PP.S.9(这里的PP就是Plus P)。这一层是属于管子的base layer。更多关于base layer的介绍,可以查看下面这份教程。 https://alidocs.dingtalk.com/api/doc/transit?spaceId5…

从零到一学习c++(基础篇--筑基期十一-类)

从零到一学习C(基础篇) 作者:羡鱼肘子 温馨提示1:本篇是记录我的学习经历,会有不少片面的认知,万分期待您的指正。 温馨提示2:本篇会尽量用更加通俗的语言介绍c的基础,用通俗的语言去…

DeepSeek技术全景解析:架构创新与行业差异化竞争力

一、DeepSeek技术体系的核心突破 架构设计:效率与性能的双重革新 Multi-head Latent Attention (MLA):通过将注意力头维度与隐藏层解耦,实现显存占用降低30%的同时支持4096超长上下文窗口。深度优化的MoE架构:结合256个路由专家…

插入排序:一种简单而直观的排序算法

大家好!今天我们来聊聊一个简单却非常经典的排序算法——插入排序(Insertion Sort)。在所有的排序算法中,插入排序是最直观的一个。 一、插入排序的基本思想 插入排序的核心思想是:将一个待排序的元素,插…

2025年校园网络招聘会汇总

1、卫生健康行业2025届毕业生春季校园网络招聘会 企业数量职位数量岗位数量10020002000 访问地址: https://www.weirenjob.com/zph/zph_wsjkxy2025jbyscjxywlzph/ 2、山东地区面向2025届高校毕业生网络招聘活动 企业数量职位数量岗位数量909271052434 访问地址&a…

Windows 10 GPU STACK 0.5.1 安装

Windows 10 GPU STACK 0.5.1 安装 1 GPUStack 安装1.Python安装(3.10/11/12)2.GPUStack 下载3.生成密码4.访问5.设置模型下载目录6.禁用开机自启并重启服务7.安装模型8.查看安装的进度 2.试验场聊天测试1.对话模式 3.API Key 测试 1 GPUStack 安装 1.Py…

【数据结构】快指针和慢指针

一、 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 要求:只遍历一遍链表 可以使用快慢指针:fast 一次走两步,slow 一次走一步。当 fast NULL(偶数个结点)或…

1.3 嵌入式系统的固件

嵌入式系统的固件,一般情况下的作用是: 1.硬件抽象层(HAL):固件提供了一个硬件抽象层,它将硬件的复杂性隐藏起来,为上层软件提供了一套标准的接口。这样,操作系统和应用程序不需要直接与硬件打交…

中国工业互联网研究院:人工智能大模型年度发展趋势报告

当前,以大模型为代表的人工智能正快速演进,激发全球科技之变、产业之变、时代之变,人工智能发展迎来新高潮。随着大模型推理、多模态生成、智能体等创新技术的发展,大模型赋能千行百业将进一步提速。中国工业互联网研究院全方位剖…

【cv】vs2022配置opencv

release下配置包含目录和库目录 E:\sdk\sdk_cuda12.3\opencv490\include E:\sdk\sdk_cuda12.3\opencv490\include\opencv2 E:\sdk\sdk_cuda12.3\opencv490\lib release下配置包含链接器输入的依附依赖项 opencv_world490.lib release编译文件夹下需手动复制opencv_world49…

Python Pandas库使用指南:从入门到精通

1. 引言 Pandas 是 Python 中用于数据处理和分析的核心库之一。它提供了高效的数据结构(如 DataFrame 和 Series),能够轻松处理结构化数据,支持数据清洗、过滤、聚合、合并等操作。Pandas 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Pandas 的基本…

Visual Studio中打开多个项目

1) 找到解决方案窗口 2) 右键添加→ 选择现有项目 3) 选择.vcxproj文件打开即可

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

内外网隔离文件传输解决方案|系统与钉钉集成+等保合规,安全提升70%

一、背景与痛点 在内外网隔离的企业网络环境中,员工与外部协作伙伴(如钉钉用户)的文件传输面临以下挑战: 1. **安全性风险**:内外网直连可能导致病毒传播、数据泄露。 2. **操作繁琐**:传统方式需频繁切…

多线程篇学习面试

多线程 1.乐观锁、CAS思想 java乐观锁机制: ​ 乐观锁体现的是悲观锁的反面。它是一种积极的思想,它总是认为数据是不会被修改的,所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种&a…

云服务器和物理服务器该如何选择

随着互联网的快速发展,企业大多都会选择云服务器和物理服务器进行使用,那么对于云服务器和物理服务器两者之间该如何进行选择呢? 云服务器可以为用户和企业提供网站处理中等到高流量所需要的一切,云服务器中的高可用能性功能&…

将产品照片(form.productPhotos)转为 JSON 字符串发送给后端

文章目录 1. 前端 form.productPhotos 的当前处理a. 组件绑定b. 当前发送逻辑 2. 如何将 form.productPhotos 转为 JSON 字符串发送给后端a. 修改前端 save() 方法b. 确保 esave API 支持接收字符串 基于你提供的 identify-form.vue 代码,我将分析如何将产品照片&a…