python——distance_transform_edt的使用(计算距离)

本文详细介绍了scipy库中的distance_transform_edt函数,该函数用于图像处理中的距离转换,能高效计算图像中非零点到背景点的距离。通过实例演示了如何使用此函数来快速计算两个同心圆间的区域,相比传统方法,效率提升显著。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. distance_transform_edt介绍

distance_transform_edt是scipy库里的一个函数,用于距离转换,计算图像中非零点到最近背景点(即0)的距离。举例说明:
(1)现有图像A,如下图所示
在这里插入图片描述

(2)离最近背景点距离为1的用红色标出,如下图所示:
在这里插入图片描述
(3)离最近背景点距离为 2 \sqrt 2 2 的用绿色标出,如下图所示:
在这里插入图片描述
(4)离最近背景点距离为2 的用橘色标出,如下图所示:
在这里插入图片描述
经过转换后,为
在这里插入图片描述

2. 代码

import numpy as np
from scipy import ndimage

A = np.array(
  [
    [0, 0, 1, 1, 1],
    [1, 0, 0, 1, 1],
    [0, 0, 1, 1, 0],
    [0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0],
  ]
)

dis = ndimage.morphology.distance_transform_edt(A)
print(dis)

结果如下图所示:
在这里插入图片描述

3. 应用——计算图像中两个同心圆之间的区域

假设有

  1. 图像大小为299x299
  2. 圆心坐标row, col分别为133, 75
  3. 小圆半径为54,大圆半径为108

如下所示:
在这里插入图片描述
现在只要取ROI区域,有一种办法是,遍历图像中的每个点,然后判断点到圆心坐标的距离在r1到r2之间,但是这种方法的缺点是 太慢了!!!太慢了!!!太慢了!!!

用distance_transform_edt可以大大提高效率。
代码如下:

import cv2
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

row, col = 133, 75
r1 = 54
r2 = 108

img = cv2.imread('puck.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img_temp = np.ones([299, 299])
img_temp[133, 75] = 0
dis = ndimage.morphology.distance_transform_edt(img_temp)
img[dis < r1] = 0
img[dis > r2] = 0

plt.imshow(img)
plt.show()

显示图像如下图所示:
在这里插入图片描述
总结:
之前测试,如果用遍历像素点到圆心的距离的方法筛选ROI区域,耗时5秒多;而distance_transform_edt耗时大概0.5秒,差了10倍!!!

结束。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值