opencv:距离变换 cv2.distanceTransform

news/2025/2/25 8:52:41

函数 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.niftyadmin.cn/n/5865277.html

相关文章

halcon三维点云数据处理(二十五)moments_object_model_3d

目录 一、moments_object_model_3d例程二、moments_object_model_3d函数三、效果图一、moments_object_model_3d例程 这个例子说明了如何使用moments_object_model_3d运算符来将3D数据与x、y、z坐标轴对齐。在实际应用中,通过3D传感器获取的物体模型可能具有一个与物体主轴不…

C++中tuple的用法

C中tuple的用法 在C中&#xff0c;std::tuple 是一个模板类&#xff0c;用于存储一组不同类型的值。它类似于 Python 中的元组&#xff0c;但具有更强大的功能&#xff0c;例如支持不同类型的元素和更复杂的操作。std::tuple 是 C11 标准引入的&#xff0c;位于 <tuple>…

java23种设计模式-工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;学习笔记 &#x1f31f; 定义 工厂方法模式属于创建型设计模式&#xff0c;定义一个创建对象的接口&#xff0c;但让子类决定实例化哪一个类。将类的实例化操作延迟到子类&#xff0c;是面向对象设计中"开闭…

OPPO发布新型折叠屏手机 起售价8999

在竞争激烈的智能手机市场&#xff0c;折叠屏手机作为高端科技的代表&#xff0c;一直备受关注。2025年2月20日晚&#xff0c;OPPO推出最新一代折叠屏旗舰手机Find N5&#xff0c;以其极致轻薄的设计、全面升级的性能和创新的功能&#xff0c;再次成为行业焦点。这款起售价8999…

在大数据项目中如何设计和优化数据模型

在大数据项目中&#xff0c;设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法&#xff1a; 一、数据模型设计 明确业务需求&#xff1a; 深入了解项目的业务场景和目标&#xff0c;明确数据模型需要解决的具体问题。与业务团队紧密合作&#xf…

Python GUI

Python GUI pip install PyQt5 pip install PySide2 pip install wxPython 这个下载太久了 import tkinter as tk def main(): # 创建主窗口 root tk.Tk() root.title("Hello World") # 创建一个标签&#xff0c;显示文本 label tk.Lab…

《计算机视觉OpenCV》——对视频中的文档进行实时检测和处理实例

对视频中的文档进行实时检测和处理 项目介绍&#xff1a;主要实现了从摄像头实时捕获视频流&#xff0c;检测其中的文档&#xff08;四边形物体&#xff09;&#xff0c;并对检测到的文档进行透视变换和二值化处理的功能。 综合运用了摄像头操作、图像处理、轮廓检测、透视变换…

VUE2.0+elementUI+腾讯云点播上传视频

“vue”: “^2.6.11”, TcVod&#xff1a; “vod-js-sdk-v6”: “^1.7.0”, “element-ui”: “^2.15.6”, 直接上代码 上传视频加上传封面 在这里插入代码片 <template><div><p>上传封面</p><el-uploadclass"avatar-uploader"actio…