【Python】画像の回転・反転・平行移動|OpenCVのアフィン変換による画像処理

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ
  • Pythonによる画像処理に興味がある。
  • OpenCVの画像処理を適用し「回転・反転画像」「平行移動した画像」を出力したい。
目次

OpenCVとは

OpenCV(Open Source Computer Vision Library)とは、画像処理やコンピュータビジョンの分野で広く活用されているオープンソースライブラリです。画像データの数値処理に強いのが特徴であり、高度な統計アルゴリズムも多数含まれていることから、近年機械学習の分野でも広く利用されています。

【OpenCV】アフィン変換とは

アフィン変換とは、画像の平行移動、回転、拡大・縮小を実現するための座標変換技法であり、上図のような行列式を用いて変換が実行されます。

【Python】OpenCVのアフィン変換|画像の回転・反転

PythonのOpenCVパッケージを活用し、アフィン変換を適用する方法について解説します。

各変換技法毎の出力イメージおよびコードを確認していきましょう。

画像の回転

画像を回転移動して表示する方法を以下に示します。画像読込の部分変換したい画像のディレクトリを指定し、コードを実行してみましょう。

import cv2
import numpy as np

# 画像読込
img = cv2.imread("image_data.jpg")

# 画像サイズ
height = img.shape[0]  # 高さ
width  = img.shape[1]  # 幅

#画像の回転行列
rot_matrix = cv2.getRotationMatrix2D((width/2,height/2),  # 回転の中心座標
                                      45,                 # 回転する角度
                                      1,                  # 画像のスケール
                                    )

# アフィン変換適用
afin_img = cv2.warpAffine(img,               # 入力画像
                          rot_matrix,        # 行列
                          (width,height)     # 解像度
                         )

# 画像表示
cv2.imshow("img",afin_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の反転

画像を180度反転させて表示する方法を以下に示します。

画像反転はcv2.getRotationMatrix2Dメソッドの回転角度で調整できます。

import cv2
import numpy as np

#画像読込
img = cv2.imread("image_data.jpg")

# 画像サイズ
height = img.shape[0]  # 高さ
width  = img.shape[1]  # 幅

#画像の回転行列
rot_matrix = cv2.getRotationMatrix2D((width/2,height/2),  # 回転の中心座標
                                      180,                # 回転する角度
                                      1,                  # 画像のスケール
                                    )

# アファイン変換適用
afin_img = cv2.warpAffine(img,               # 入力画像
                          rot_matrix,        # 行列
                          (width,height)     # 解像度
                         )

# 画像表示
cv2.imshow("img",afin_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【Python】OpenCVのアファイン変換|画像の平行移動

PythonのOpenCVライブラリを用いて画像を平行移動して表示したい場合、次のコードを用います。

平行移動する値部分の値を調節することで、柔軟に画像の平行移動が実現できます。

import cv2
import numpy as np

#画像読込
img = cv2.imread("image_data.jpg")

# 画像サイズ
height = img.shape[0]  # 高さ
width  = img.shape[1]  # 幅

# 平行移動する値|画像を100pxずつ並行移動
dx,dy = 100,100

# 平行移動の変換行列を作成
afin_matrix = np.float32([[1,0,dx],[0,1,dy]])

# アファイン変換適用
afin_img = cv2.warpAffine(img,           # 入力画像
                          afin_matrix,   # 行列
                         (width,height)  # 解像度
                         )

# 画像表示
cv2.imshow("img",afin_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

【参考】Python・OpenCVを用いた画像処理

当サイトでは、PythonのOpenCVライブラリを用いた画像処理ノウハウを多数公開しています。

用途【Python×OpenCV】記事名
画像変換画像のリサイズ・拡大・縮小
画像変換画像の回転・反転・平行移動|アフィン変換
画像変換画像の明るさ調節|ガンマ補正
画像変換グレースケール・HSV・L*a*b|色空間の変換
画像変換モノクロ(白黒)画像変換|2値化処理
画像変換ヒストグラムの描画・ヒストグラム均一化処理
画像変換画像上にテキスト・図形(直線・長方形・円)を描画
画像変換画像の透視変換・遠近法
画像変換画像のノイズ除去・平滑化
画像変換画像の畳み込み(空間フィルタリング)
特徴抽出エッジの検出方法

画像認識や物体検出を学ぶ上でおすすめの教材はこちらをご参考ください。

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次