Solving the distance transform of an image using brute force method without using loops

import time

import matplotlib.pyplot as plt
import numpy as np
# a_time = time.time()
# arr = np.array([
#     [0, 0, 0, 0, 0, 0, 0, 0],
#     [0, 0, 0, 0, 0, 0, 0, 0],
#     [0, 0, 0, 0, 0, 0, 0, 0],
#     [0, 0, 0, 1, 1, 0, 0, 0],
#     [0, 0, 0, 0, 0, 0, 0, 0],
#     [0, 0, 0, 0, 0, 0, 0, 0],
#     [0, 0, 0, 0, 0, 0, 0, 0]])
# arr = np.zeros((1000,1000))
# arr[500][500] = 1
# arr[500][501] = 1
# arr[500][502] = 1
#
# # 找到1的索引
# indices = np.argwhere(arr == 1)
#
# distances = []
# for i in range(arr.shape[0]):
#     for j in range(arr.shape[1]):
#
#             # 计算到最近的1点的距离
#         min_distance = np.min(np.linalg.norm(indices - [i, j], axis=1))
#         distances.append(min_distance)
# b_time = time.time()
# print(b_time-a_time)
#
# distances = np.array(distances).reshape(7,8)
# distances = distances/np.max(distances)*255
# plt.imshow(distances,cmap='gray')
# plt.show()
# # print(distances)


import numpy as np

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

# 找到1的索引
b_time = time.time()
indices = np.argwhere(arr == 1)
indices1 = np.indices(arr.shape)
x_indices = indices1[0].ravel()
y_indices = indices1[1].ravel()
result_indices = (x_indices, y_indices)
# 计算距离
a = indices[:, 0, None]-result_indices[0]
b = indices[:, 1, None]-result_indices[1]
c = np.sqrt(a**2+b**2)
# distances = np.sqrt(np.min((indices[:, 0, None] - result_indices)**2
#                     + (indices[:, 1, None] - result_indices)**2, axis=1))
c_time = time.time()
print(c_time-b_time)
min_values = np.min(c,axis=0).reshape(7,8)
plt.imshow(min_values,cmap='gray')
plt.show()
# min_values.shape
# print(distances)

Guess you like

Origin blog.csdn.net/qq_60943902/article/details/132795672