Skip navigation

Affin transzformációk

Affin transzformáció reprezentációja és végrehajtása (OpenCV)

Reprezentáció

Az affin transzformáció matematikailag megadható egy 2x3 méretű mátrixszal, vagyis szabadsági foka 6:

Ezzel balról szorozva egy 3 elemű oszlopvektort, amely a transzformálandó pont X és Y koordinátáit, valamint egy 1 értéket tartalmaz, egy újabb 2 elemű oszlopvektort kapunk, a pont transzformált képét.

\left( \begin{matrix} x' \\ y' \end{matrix} \right) = M \left( \begin{matrix} x \\ y \\ 1 \end{matrix} \right)

Vagyis

Az rij értékek a forgatást, skálázást és a nyírást együttesen foglalják magukban, a t értékek az eltolást jelentik.

Eltolás megadása mátrixszal

tx és ty értékek megadásával. Kombinálható a forgató, skálázó, nyíró résszel. Az eltolás hatása érvényesül utolsóként. Ha csak eltolást szeretnénk, akkor r11 = r22 = 1 és r12 = r21 = 0 legyenek.

Skálázó/tükröző mátrix

r11 az X-tengely menti skálázó érték, r22 az Y-tengely menti, amennyiben r12 = r21 = 0. Ha skála értéke 0 és 1 közötti, akkor kicsinyítő a hatás, 1 esetén nincs változás, 1-nél nagyobb értékek esetén nagyítás történik. Negatív érték esetén a skálázás mellett tengelyre való tükrözés is történik. Figyeljünk arra, hogy ekkor a koordináta-értékek negatívvá válnak, ha nem vigyázunk, a képtartományon kívül eshetnek!

Forgatás mátrixa

Mind a 4 rij érték szükséges. Legegyszerűbb az alábbi OpenCV függvénnyel dolgozni, ezzel lehetőségünk van a forgatási középpont (origótól különböző), és skálatényező megadására is.

M = cv2.getRotationMatrix2D(center, angle, scale)

center Elforgatás középpontja, tuple objektumként megadva.
angle Elforgatás szöge (fokokban).
scale Uniform (egyenlő mértékű) skálázó érték.

Eredményül a forgatást reprezentáló 2x3 méretű mátrixot kapjuk.

Affin transzformáció végrehajtása képre

A végrehajtást megelőzően elő kell állítanunk az affin mátrixot, például a fentebb leírt módokat használva.

dst = cv2.warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)

dst Célkép. Nem lehet azonos a forrással!
src Forráskép.
M Végrehajtandó transzformáció mátrixa.
dsize Célkép mérete, tuple objektumként megadva.
flags Opcionális: Interpolációs technika választása (mint resize esetén) + WARP_INVERSE_MAP megadása, ha M inverz transzformációs mátrix.
borderMode Opcionális: Extrapolációs módszer választása (nem definált területre). Alapértelmezés: BORDER_TRANSPARENT.
borderValue Opcionális: A transzformáció alkalmazása során értéket nem kapó intenzitások értéke. Alapértéke 0.

04_02_translate.py

Képmátrix eltolása. Az eltolás hatást manuális transzformációs mátrix létrehozással oldjuk meg.

import cv2
import numpy as np

img = cv2.imread('OpenCV-logo.png', 0)
rows, cols = img.shape

M = np.float32([[1, 0, 100], [0, 1, 50]])
dst = cv2.warpAffine(img, M, (cols, rows))

cv2.imshow('img', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

04_04_rotate_trackbar.py

Kép forgatása a középpontja körül. A forgatási értéket csúszkával állíthatjuk.

import numpy as np
import cv2


def ontrackbar(x):
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), x, 1)
dst = cv2.warpAffine(img, M, (cols, rows))
cv2.imshow('image', dst)


img = cv2.imread('OpenCV-logo.png', 0)
rows, cols = img.shape
cv2.namedWindow('image')

cv2.createTrackbar('R', 'image', 0, 360, ontrackbar)
ontrackbar(0)

cv2.waitKey(0)
cv2.destroyWindow('image')