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

目录

  • 1. distance_transform_edt介绍
  • 2. 代码
  • 3. 应用——计算图像中两个同心圆之间的区域

1. distance_transform_edt介绍

distance_transform_edt是scipy库里的一个函数,用于距离转换,计算图像中非零点到最近背景点(即0)的距离。举例说明:
(1)现有图像A,如下图所示
python——distance_transform_edt的使用(计算距离)_第1张图片
(2)离最近背景点距离为1的用红色标出,如下图所示:
python——distance_transform_edt的使用(计算距离)_第2张图片
(3)离最近背景点距离为 2 \sqrt 2 2 的用绿色标出,如下图所示:
python——distance_transform_edt的使用(计算距离)_第3张图片
(4)离最近背景点距离为2 的用橘色标出,如下图所示:
python——distance_transform_edt的使用(计算距离)_第4张图片
经过转换后,为
python——distance_transform_edt的使用(计算距离)_第5张图片

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)

结果如下图所示:
python——distance_transform_edt的使用(计算距离)_第6张图片

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

假设有

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

如下所示:
python——distance_transform_edt的使用(计算距离)_第7张图片
现在只要取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()

显示图像如下图所示:
python——distance_transform_edt的使用(计算距离)_第8张图片
总结:
之前测试,如果用遍历像素点到圆心的距离的方法筛选ROI区域,耗时5秒多;而distance_transform_edt耗时大概0.5秒,差了10倍!!!

结束。

你可能感兴趣的:(python——distance_transform_edt的使用(计算距离))