OpenCV (12) --- Аффинное геометрическое преобразование

OpenCV
OpenCV (12) --- Аффинное геометрическое преобразование

аффинный

В OpenCV аффинное преобразование относится к перемещению, вращению и другим операциям, которые реализуются с изображением посредством ряда геометрических преобразований. Это преобразование сохраняет плоскостность и параллелизм изображения. Прямолинейность означает, что после аффинного преобразования изображение остается прямой линией, а параллелизм означает, что изображение остается параллельным после завершения аффинного преобразования.

В OpenCV она предоставляет нам аффинную функцию cv2.warpAffine(), которая реализуется матрицей преобразования M. Если вы мало знаете о матричных операциях, вы можете вспомнить, что будет объяснено позже, или вы можете изучить дискретные операции. математика или линейная алгебра. , оба объясняют матричные операции.

Определение аффинной функции выглядит следующим образом:

def warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None):

src: представляет исходное изображение как аффинное

M: представляет собой матрицу преобразования 2 * 3. Используя различные матрицы преобразования, можно достичь различных аффинных преобразований.

dszie: представляет размер выходного изображения.

dst: представляет выходное изображение после аффинного

flags: представляет метод интерполяции, по умолчанию INTER_LINEAR. Когда значение равно WARP_INVERSE_MAP, это означает, что M является типом обратного преобразования, который реализует обратное преобразование из целевого изображения dst в исходное изображение src. Подробные параметры можно найти в форме в предыдущем сообщении блога.

borderMode: представляет тип ребра, значение по умолчанию — BORDER_CONSTANT. Когда значение BORDER_TRANSPARENT, это означает, что значения в целевом изображении не меняются, и эти значения соответствуют выбросам в исходном изображении.

borderValue: представляет значение границы, по умолчанию 0.

Подводя итог, наши часто используемые параметры: src, M, dsize.

Сковорода

Известная аффинная формула:

仿射公式Допустим, теперь мы хотим перевести изображение на 50 пикселей вправо и на 100 пикселей вниз, тогда формулы заменяются следующим образом:

dst(x,y)=src(x+50,y+100)

dst(x,y)=src(1x,+0y+50,0x+1y+100)

Получите значение каждого элемента в M:

M11=1

M12=0

M13=50

M21=0

M22=1

M23=100

Подводя итог, матрица преобразования для сдвига вправо на 50 пикселей и сдвига вниз на 100 пикселей выглядит следующим образом:

M

Зная матрицу преобразования и исходное изображение, мы можем легко выполнить операцию перевода изображения Конкретный код выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
h, w = img.shape[:2]
x = 50
y = 100
M = np.float32([[1, 0, x], [0, 1, y]])
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:图像

вращать

При использовании функции cv2.warpAffine() для поворота изображения матрицу преобразования можно получить с помощью функции cv2.getRotationMatrix2D(). Синтаксис этой функции:

def getRotationMatrix2D(center, angle, scale):

центр: центр вращения

угол: угол поворота, положительное число означает вращение против часовой стрелки, а отрицательное число означает вращение по часовой стрелке

масштаб: для размера преобразования (то есть размер масштабирования, упомянутый выше)

Далее, давайте повернем изображение выше на 45 градусов, Конкретный код выглядит следующим образом:

import cv2

img = cv2.imread("4.jpg")
h, w = img.shape[:2]
M = cv2.getRotationMatrix2D((w / 2, h / 2), 45, 0.6)
move_img = cv2.warpAffine(img, M, (w, h))
cv2.imshow("img", img)
cv2.imshow("move_img", move_img)
cv2.waitKey()
cv2.destroyAllWindows()

Просто измените матрицу преобразования M, где (w / 2, h / 2) — координата центра изображения, 45 — положительное число, означающее поворот на 45 градусов против часовой стрелки, а 0,6 — масштабирование изображения в 0,6 раза.

После запуска эффект следующий:图像