Python OpenCV3で画像のアフィン変換(回転とか移動とか)

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

今回は画像を回転させたり移動させたりする。

[amazonjs asin=”4061538225″ locale=”JP” title=”OpenCVによる画像処理入門 (KS情報科学専門書)”]

前提

ディレクトリ構成などはこことかこことか。

&nbsp

元画像

この画像(slack_botter.png)を使う。
以前の例だとsource/imageディレクトリ配下に設置する。

slack_botter

 

warpAffineメソッドの解説

アフィン変換で回転と移動を行う。
アフィン変換はOpenCV3のwarpAffineメソッドを使う。
warpAffineメソッドは使い方が難しいため、少し解説する。

引数は次の通り。

[python title=”warpAffine”] cv2.warpAffine(イメージソース,回転・移動を指定する行列,画像の大きさ,flags)
[/python]

イメージソースは、cv2.imreadメソッドで取得した画像。
回転・移動を指定する行列は後ほど。
画像の大きさはあとのソースで簡単に取得できる。
flagsは画像の補間の方法で、次の5つから選ぶ。

INTER_NEAREST
INTER_LINEAR(デフォルト)
INTER_AREA
INTER_CUBIC
INTER_LANCZOS4

問題の画像の回転は基本的には以下のように指定した時の、affine_matrix。

[python] rad = 回転する角度(ラジアン)
matrix = [
[np.cos(rad), -np.sin(rad), x軸方向に移動する距離],
[np.sin(rad), np.cos(rad), y軸方向に移動する距離] ] affine_matrix = np.float32(matrix)
[/python]

 

アフィン変換で移動、回転する

実際にアフィン変換してみる。
sourceディレクトリにaffine.pyを作成する。

[python title=”affine.pyの内容”] # -*- coding: utf-8 -*-

import cv2
import numpy as np

if __name__ == ‘__main__’:

# 画像読み込み
img_src = cv2.imread("./image/slack_botter.png", 1)

# 画像サイズの取得(横, 縦)
size = tuple(np.array([img_src.shape[1], img_src.shape[0]]))

# 回転させたい角度
rad = np.pi / 4
# x軸方向に平行移動させたい距離
move_x = 0
# y軸方向に平行移動させたい距離
move_y = img_src.shape[0] * -0.5

matrix = [
[np.cos(rad), -1 * np.sin(rad), move_x],
[np.sin(rad), np.cos(rad), move_y] ]

affine_matrix = np.float32(matrix)

img_afn = cv2.warpAffine(img_src, affine_matrix, size, flags=cv2.INTER_LINEAR)

# 表示
cv2.imshow("Show AFFINE Image", img_afn)
cv2.waitKey(0)
cv2.destroyAllWindows()

[/python]

実行すると、

スクリーンショット 2015-06-25 22.20.02

回転移動できた。