Найти самую длинную линию с помощью деревьев ⇐ Python
-
Anonymous
Найти самую длинную линию с помощью деревьев
Я работаю над поиском самой большой лески, используя деревья для рыбы; Есть ли способ избежать плавников и найти самый длинный от головы до хвоста?
В настоящее время 2 точки, расположенные на максимальном расстоянии, находятся на плавнике рыбы, а другая на хвосте; но мне нужны две точки на голове и хвосте, чтобы вычислить самую большую линию.
binary_fish = cv2.imread('/content/fish4-masked.jpg', cv2.IMREAD_GRAYSCALE) # Шаг 1: Предварительная обработка # Применяем эрозию и расширение к бинарному изображению рыбы ядро = np.ones((3, 3), np.uint8) двоичная_рыба = cv2.erode(двоичная_рыба, ядро, итерации = 1) binary_fish = cv2.dilate(binary_fish, kernel, итерации=1) # Шаг 2: Порог для создания двоичного изображения _,binary_fish = cv2.threshold(binary_fish, 128, 255, cv2.THRESH_BINARY) # Шаг 3: Скелетирование бинарного изображения рыбы скелет = morphology.skeletonize(binary_fish > 0) # Шаг 4: Найдите центральную линию скелета скелет = скелет.astype(np.uint8) * 255 # Находим контуры скелета контуры, _ = cv2.findContours(скелет, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Извлекаем самый большой контур (предполагая, что это центральная линия) осевая линия = max(contours, key=cv2.contourArea) # Создаем пустой холст высота, ширина =binary_fish.shape centerline_image = np.zeros((высота, ширина), dtype=np.uint8) # Нарисуйте центральную линию на холсте cv2.drawContours(centerline_image, [центральная линия], -1, 255, 1) # Находим координаты точек на центральной линии точки = centerline.squeeze(ось=1) макс_дистанция = 0 самые дальние_точки = (0, 0), (0, 0) # Вычисляем попарные расстояния и находим две самые дальние точки для i в диапазоне (len(points)): для j в диапазоне (i + 1, len(points)): x1, y1 = точки x2, y2 = точки[j] расстояние = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) если расстояние > max_distance: max_distance = расстояние дальние_точки = (x1, y1), (x2, y2) самая дальняя_точка1, самая дальняя_точка2 = самые дальние_точки радиус = 5 # Радиус круга color = (0, 255, 0) # Зеленый цвет (можно выбрать другой цвет) толщина = -1 # Заполняем круг # Нарисуйте первую самую дальнюю точку cv2.circle(исходная_рыба, самая дальняя_точка1, радиус, цвет, толщина) # Нарисуйте вторую самую дальнюю точку cv2.circle(исходная_рыба, самая дальняя_точка2, радиус, цвет, толщина) Изображение скелета 2-точечное изображение
Я реализовал скелетонизацию, чтобы найти скелет; благодаря плавникам к центральной линии скелета прикреплены дополнительные ветви.
Я работаю над поиском самой большой лески, используя деревья для рыбы; Есть ли способ избежать плавников и найти самый длинный от головы до хвоста?
В настоящее время 2 точки, расположенные на максимальном расстоянии, находятся на плавнике рыбы, а другая на хвосте; но мне нужны две точки на голове и хвосте, чтобы вычислить самую большую линию.
binary_fish = cv2.imread('/content/fish4-masked.jpg', cv2.IMREAD_GRAYSCALE) # Шаг 1: Предварительная обработка # Применяем эрозию и расширение к бинарному изображению рыбы ядро = np.ones((3, 3), np.uint8) двоичная_рыба = cv2.erode(двоичная_рыба, ядро, итерации = 1) binary_fish = cv2.dilate(binary_fish, kernel, итерации=1) # Шаг 2: Порог для создания двоичного изображения _,binary_fish = cv2.threshold(binary_fish, 128, 255, cv2.THRESH_BINARY) # Шаг 3: Скелетирование бинарного изображения рыбы скелет = morphology.skeletonize(binary_fish > 0) # Шаг 4: Найдите центральную линию скелета скелет = скелет.astype(np.uint8) * 255 # Находим контуры скелета контуры, _ = cv2.findContours(скелет, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # Извлекаем самый большой контур (предполагая, что это центральная линия) осевая линия = max(contours, key=cv2.contourArea) # Создаем пустой холст высота, ширина =binary_fish.shape centerline_image = np.zeros((высота, ширина), dtype=np.uint8) # Нарисуйте центральную линию на холсте cv2.drawContours(centerline_image, [центральная линия], -1, 255, 1) # Находим координаты точек на центральной линии точки = centerline.squeeze(ось=1) макс_дистанция = 0 самые дальние_точки = (0, 0), (0, 0) # Вычисляем попарные расстояния и находим две самые дальние точки для i в диапазоне (len(points)): для j в диапазоне (i + 1, len(points)): x1, y1 = точки x2, y2 = точки[j] расстояние = math.sqrt((x2 - x1)**2 + (y2 - y1)**2) если расстояние > max_distance: max_distance = расстояние дальние_точки = (x1, y1), (x2, y2) самая дальняя_точка1, самая дальняя_точка2 = самые дальние_точки радиус = 5 # Радиус круга color = (0, 255, 0) # Зеленый цвет (можно выбрать другой цвет) толщина = -1 # Заполняем круг # Нарисуйте первую самую дальнюю точку cv2.circle(исходная_рыба, самая дальняя_точка1, радиус, цвет, толщина) # Нарисуйте вторую самую дальнюю точку cv2.circle(исходная_рыба, самая дальняя_точка2, радиус, цвет, толщина) Изображение скелета 2-точечное изображение
Я реализовал скелетонизацию, чтобы найти скелет; благодаря плавникам к центральной линии скелета прикреплены дополнительные ветви.
Мобильная версия