https://qiita.com/koshian2/items/c133e2e10c261b8646bf

More than 3 years have passed since last update.

アフィン変換の真価を知ったら実はかなり強かった、という話。我々はアフィン変換の本当のすごさを知らない。

サンプル

非常に複雑な変換に見えますが、たった1回のアフィン変換でやっています。この記事の処理を組み合わせていけばこの処理が実装できます。

アフィン変換

平面のアフィン変換とは三角形の移動(写像)を与えることで決まる変換のこと(証明は末尾参照)。

画像の回転処理にアフィン変換がよく用いられますが、アフィン変換≠回転です。アフィン変換はもっと広く処理ができますし、回転処理はその一部です。最初に回転を考えると理解しにくくなります。

OpenCVでの実装

今回は数学的にあまり突っ込まずに「PythonのOpenCVで自分で実装できればOK」レベルを目指します。OpenCVでは次のようにアフィン変換を行います。

import cv2
af = cv2.getAffineTransform(src, dest)
converted = cv2.warpAffine(image, af, (size_x, size_y))

src, destには3点分のxy座標をnp.float32型で(3,2)のshapeのNumpy配列で与えます。imageには画像のNumpy配列、**(size_x, size_y)**は出力のサイズを表します。

また回転操作では変換後の座標をいちいち三角関数で計算するのが面倒なので、getRotationMatrix2Dという専用の関数が用意されています。やっていることはgetAffineTransformと同じです。

この画像を変換していきます。「gorilla.jpg」とします。

移動元と移動先が全く同じになるような変換。