Преобразование растрового изображения в векторное
Например, у меня есть photo.jpg
в котором нарисована простая геометрическая фигура, допустим квадрат.
Возможно ли преобразовать содержимое изображения в координаты расположения и отрисовки объекта?
Примерно такой формат
draw.rectangle((400, 200, 600, 400), outline="red", width=3)
Ответы (1 шт):
Насколько я понял, вы хотите получить координаты уже нарисованного объекта из файла. Это можно сделать при помощи трассировки изображения при помощи OpenCV, однако для этого нужно хорошо владеть данным инструментом. (Встроенными инструментами PIL у вас врядли что-либо разумное и без костылей получится).
Однако я не просто так пишу этот ответ. В математике существует некий алгоритм Собеля, позволяющий обнаруживать границы, а также алгоритмы Хафа, позволяющие найти контуры прямоугольников и т.п.
Для этого нужно перевести изображение в Ч/Б, применяем Собеля для выделения границ, а потом Хафа для обнаружения прямоугольников:
import cv2
import numpy as np
image = cv2.imread('kvadr.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150)
contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
if len(approx) == 4:
cv2.drawContours(image, [approx], 0, (0, 255, 0), 2)
print('Найден квадрат! Его точки: \n',approx.tolist())
#Для рисования прямоугольника PIL использует две точки: верхняя-левая и нижняя-правая, а данный скрипт даёт по 4 точки, но методом тыка я вычислил, что нужные нам точки - первая и третья из списка:
coordinates=approx.tolist()
print(f"Команда для отрисовки: draw.rectangle(({coordinates[0][0][0]}, {coordinates[0][0][1]}, {coordinates[2][0][0]}, {coordinates[2][0][1]}))\n""")
cv2.imshow('Алгоритм Хафа', image)
cv2.waitKey(0)
cv2.destroyAllWindows()