аффинный
В 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 пикселей выглядит следующим образом:
Зная матрицу преобразования и исходное изображение, мы можем легко выполнить операцию перевода изображения Конкретный код выглядит следующим образом:
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 раза.
После запуска эффект следующий: