Я пытаюсь найти максимальную ширину кривой, используя openCV в python. Я использовал хитрый детектор краев, чтобы получить границы кривой. Затем мне удалось создать скелет между ними, как показано красной линией на прикрепленном изображении а>. Теперь мне нужно найти расстояние между этим скелетом и сегментами белой линии, чтобы я мог умножить максимальное расстояние на 2, чтобы получить ширину. Короче говоря, мне нужна длина синей линии.
Я пытался использовать преобразование расстояния, но у меня нет замкнутого контура, поэтому я получаю неправильную ширину. Я также пробовал расширение с последующей эрозией, чтобы получить закрытый контур, но это изменило ширину моей кривой. Застрял на этом надолго. Любая помощь будет высоко ценится.
Ответ 1 · рейтинг 4 · jmetz
Максимальная ширина - это максимальное расстояние от любой точки на границе до средней линии (возможно, умноженное на два).
Чтобы определить это значение, вы можете использовать distance_transform следующим образом:
import numpy as np
import matplotlib.pyplot as plt
import cv2
# Generate test image
size = (100, 100)
mid_line = np.zeros(size, dtype='uint8')
mid_line[(range(10, 40), range(10, 40))] = 1
mid_line[(range(40, 80), np.linspace(40, 70, 40).astype(int))] = 1
outline = np.zeros(size, dtype='uint8')
outline[(np.linspace(5, 33, 30).astype(int),
np.linspace(16, 47, 30).astype(int))] = 1
outline[(np.linspace(14, 47, 30).astype(int),
np.linspace(5, 35, 30).astype(int))] = 1
outline[(np.linspace(36, 72, 40).astype(int),
np.linspace(50, 77, 40).astype(int))] = 1
outline[(np.linspace(47, 88, 40).astype(int),
np.linspace(35, 65, 40).astype(int))] = 1
dist = cv2.distanceTransform(255 - (255*mid_line), cv2.DIST_L2, 3)
# Visualize
plt.figure("Mid line plus edges over the distance transform")
plt.imshow(dist, cmap='gray')
overlay = mid_line + 2 * outline
plt.imshow(np.ma.masked_where(overlay == 0, overlay), cmap='jet', alpha=0.6)
# Get the maximum width
max_width = np.max(dist[outline > 0])
print("Maximum width:", max_width)
plt.show()
который генерирует изображение:
И выводит:
Maximum width: 10.954346
к терминалу.