Преобразование растрового изображения в векторное

Например, у меня есть photo.jpg в котором нарисована простая геометрическая фигура, допустим квадрат.

Возможно ли преобразовать содержимое изображения в координаты расположения и отрисовки объекта?

Примерно такой формат

draw.rectangle((400, 200, 600, 400), outline="red", width=3)

Ответы (1 шт):

Автор решения: OlegXio

Насколько я понял, вы хотите получить координаты уже нарисованного объекта из файла. Это можно сделать при помощи трассировки изображения при помощи 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()
→ Ссылка