Более сложные аффинные вариации
В последнем сообщении в блоге объяснялись два самых основных аффинных преобразования: перевод и вращение. Но OpenCV также предоставляет нам функцию cv2.getAffineTransform() для создания матрицы преобразования M, используемой аффинной функцией cv2.warpAffine().
Функция определяется следующим образом:
def getAffineTransform(src, dst):
src: координаты трех точек, представляющие входное изображение
dst: координаты трех точек, представляющие выходное изображение.
Любой, кто использовал PS, знает, что мы можем использовать сочетание клавиш Ctrl+T в PS, чтобы вытягивать изображение по желанию, потому что изображение имеет четыре точки сверху, снизу, слева и справа для позиционирования. 3 координаты в src точно такие же как и в PS, а именно верхний левый угол, верхний правый угол и нижний левый угол.Не хватает только одной точки, но позиционирования более чем достаточно.Конечно, это может быть только параллелограмм после отображения, потому что отсутствует одна координата.
Далее давайте расположим изображение по желанию и добьемся эффекта вытягивания:
import cv2
import numpy as np
img = cv2.imread("4.jpg")
rows,cols,ch = img.shape
p1=np.float32([[0,0],[cols-1,0],[0,rows-1]])
p2=np.float32([[0,rows*0.33],[cols*0.85,rows*0.25],[cols*0.15,rows*0.7]])
M = cv2.getAffineTransform(p1,p2)
move_img = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
После запуска эффект показан на следующем рисунке:p1 — координаты исходного изображения, здесь немного преобразованные. Координатами исходного изображения являются верхний левый угол [0, 0], верхний правый угол [cols, 0] и нижний левый угол [0, rows]. Преобразованная координата верхний левый угол [0,rows0.33], правый верхний угол [столбцы0.85,rows0,25], нижний левый угол [столбцы0,15, ряды*0,7].
перспектива
Причина, по которой мы хотим объяснить приведенный выше параллелограмм аффинно, заключается в том, что наша перспектива — это любой четырехугольник, и проще понять концепцию перспективы с помощью приведенного выше кода.
В OpenCV перспективное преобразование реализуется функцией cv2.warpPerspective(), которая определяется следующим образом:
def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):
src: исходное изображение для поворота
M: матрица преобразования 3*3 для преобразования изображения в перспективе
dsize: представляет размер выходного изображения
Три параметра flags, borderMode и borderValue аналогичны предыдущим, поэтому я не буду их здесь представлять.
Затем мы преобразуем приведенное выше изображение в произвольный четырехугольник, конкретный код выглядит следующим образом:
import cv2
import numpy as np
img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
p1 = np.float32([[0, 0], [cols, 0], [0, rows], [cols, rows]])
p2 = np.float32([[0, rows * 0.33], [cols * 0.85, rows * 0.25], [cols * 0.15, rows * 0.7], [cols * 0.85, rows * 0.85]])
M = cv2.getPerspectiveTransform(p1, p2)
move_img = cv2.warpPerspective(img, M, (cols, rows))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()
透视函数warpPerspective通过getPerspectiveTransform获得变换矩阵。 После запуска эффект следующий: