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. 应用——计算图像中两个同心圆之间的区域
假设有
- 图像大小为299x299
- 圆心坐标row, col分别为133, 75
- 小圆半径为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倍!!!
结束。