Вырежьте кусок из изображения, кусок не прямоугольный (например, трапеция), и превратите его в прямоугольник, который соответствует доске - PullRequest
0 голосов
/ 02 января 2019

Я приведу пример. У меня есть фотография плавательного бассейна с некоторыми дорожками. Я хочу взять только три средние дорожки. Теперь, как лучше всего обрезать изображение в форме трапеции, чем взять эту трапецию и попробовать?чтобы подогнать его под размер окна, которое будет иметь примерно одинаковое соотношение между двумя сторонами (верхней и нижней)

изображение для примера

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Я изменил этот пример

Результат:

enter image description here

import numpy as np 
import cv2

# load image
img = cv2.imread('pool.jpg')
# resize to easily fit on screen
img = cv2.resize(img,None,fx=0.5, fy=0.5, interpolation = cv2.INTER_CUBIC)
# determine cornerpoints of the region of interest
pts1 = np.float32([[400,30],[620,30],[50,700],[1000,700]])
# provide new coordinates of cornerpoints
pts2 = np.float32([[0,0],[300,0],[0,600],[300,600]])

# determine transformationmatrix
M = cv2.getPerspectiveTransform(pts1,pts2)
# apply transformationmatrix
dst = cv2.warpPerspective(img,M,(300,600))

# display image
cv2.imshow("img", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Обратите внимание на функцию изменения размера,Вы можете удалить эту линию, но вам придется соответственно изменить координаты угловых точек.Я использовал высоту и ширину основания трапеции для нового изображения (300 600).

Вы можете настроить угловые точки и окончательный размер изображения по своему усмотрению.

0 голосов
/ 02 января 2019

Вы можете использовать функцию imutils.four_point_transform.Вы можете прочитать больше об этом здесь .

Основное использование - это найти контуры документа на хитром обнаруженном крае изображения (опять же, вы можете использовать imutils пакет, который я связал), найти контуры на этом изображении и затем применить four_point_transform на этом контуре.

РЕДАКТИРОВАТЬ : Как использовать canny обнаружение краев и four_point_transform

Для поиска контуров вы можете использовать openCV и imutils вот так:

cnts = cv2.findContours(edged_image.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

Теперь, когда у вас есть контуры, просто переберите и посмотрите, какой из них самый большой и имеет четыре точки (4 вершины).Затем просто передайте изображение и контур функции four_point_transform следующим образом:

image_2 = four_point_transform(image, biggest_contour)

Вот и все.

...