Обрезать область с изображения, используя подушку в Python - PullRequest
0 голосов
/ 04 февраля 2019

Rectangle with lines which are not parallel to the margins

Я хочу вырезать область прямоугольной формы из изображения, используя подушку в python.Проблема в том, что прямоугольник необязателен параллельно полям изображения, поэтому я не могу использовать функцию .crop ((left, top, right, bottom)).

Есть ли способ добиться этого с помощью Pillow?(при условии, что мы знаем координаты всех 4 точек прямоугольника) Если нет, то как это можно сделать с помощью другой библиотеки Python?

The end result should look like this

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Вот решение, основанное на scikit-изображении (не на подушке), которое вы можете найти полезным.

Вы можете передать вершины области, которую хотите обрезать, в функцию skimage.draw.polygon и затем использовать полученные пиксельные координаты для маскирования исходного изображения (например, через альфа-канал).

import numpy as np
from skimage import io, draw

img = io.imread('https://i.stack.imgur.com/x5Ym4.png')

vertices = np.asarray([[150, 140],
                       [300, 240],
                       [210, 420],
                       [90, 320],
                       [150, 150]])

rows, cols = draw.polygon(vertices[:, 0], vertices[:, 1])

crop = img.copy()
crop[:, :, -1] = 0
crop[rows, cols, -1] = 255

io.imshow(crop)

Masked image

0 голосов
/ 05 февраля 2019

Вы можете использовать мин повернутый прямоугольник в OpenCV:

rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)

В результате вы получите: координаты центра (x, y), ширину, высоту, угол поворота прямоугольника.Вы можете повернуть все изображение на угол от этого прямоугольника.Ваше изображение теперь будет повернуто:

Rotated image

Вы можете рассчитать новые координаты четырех вершин прямоугольника (у вас есть угол).Затем просто вычислите нормальный прямоугольник для этих точек (нормальный прямоугольник = не минимальный, без вращения).С помощью этого прямоугольника Вы можете обрезать Ваше повернутое изображениеВ этом кадрированном изображении будет то, что Вы хотите, если я правильно понимаю Вас.Примерно так:

result

Так что вам нужен только Opencv.Может быть, есть какая-то библиотека, с которой Вы можете сделать это проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...