2022年1月26日水曜日

【OpenCV】warpAffineによるアフィン変換

 画像処理ライブラリOpenCVで画像のアフィン変換を行うwarpAffineについて説明する。
アフィン変換は変更前後で並行性を保つ変換で任意の形の平行四辺形から別の形の平行四辺形への変形。


OpenCVを使うには次のようにインポートが必要。
import cv2

例に用いる画像'paper.jpg'(幅600x高さ400ピクセル)は以下を使用(フリー写真素材ぱくたそより)




1. 書式

 cv2.warpAffineの書式は以下の通り。

dst = cv2.warpAffine(src, M, 
        dsize[, dst[, flags[, borderMode[, borderValue]]]])
引数 意味
dst 変換後の画像
src 元画像
M 2x3の変換行列
dsize 変換後の画像サイズ。(幅, 高さ)のタプルで指定
flags interpolation(補完方法)の指定など


2. getAffineTransformを用いた変換行列の生成

変換行列Mを生成するためにはgetAffineTransformを用いる。変換前の座標3点と変換後の座標3点をそれぞれ二次元ndarryで与えることで変換行列が生成される。

例の画像に対して
返還前の座標3点[175, 113], [104, 210], [285, 159]から
返還前の座標3点[100,100], [100,200], [200,100]へ変換する例。

import cv2
import numpy as np

img = cv2.imread('paper.jpg')
rows,cols,ch = img.shape

pts1 = np.float32([[175, 113], [104, 210], [285, 159]])
pts2 = np.float32([[100,100], [100,200], [200,100]])

M = cv2.getAffineTransform(pts1, pts2)

dst = cv2.warpAffine(img, M, (cols, rows))

cv2.imwrite('dst.jpg', dst)

実行結果





変換前、返還後の座標3点をそれぞれの画像に図示すると以下の通り。斜めから見た種類を正面から見た像に変換できる。

変換前



変換後





3. リファレンス

OpenCV > Geometric Image Transformations > warpAffine()
OpenCV > Geometric Image Transformations > getAffineTransform()

使用したバージョン:Python 3.8.8 / OpenCV 4.0.1

0 件のコメント:

コメントを投稿