OpenCVの使い方入門 画像の回転処理を解説
有名画像処理アルゴリズムのOpenCVで画像を回転させる
最近の画像処理ブームに乗ってOpenCVばかりの記事を書いています。私はとある製造業の会社で生産性改善の業務を行っています。
その中には生産ラインで画像処理による製品の傷検査や組付け部品の有無を確認するアプリケーションを自作しています。使っている画像処理アルゴリズムはOpenCVで,今回解説予定の画像回転も実際にアプリケーション内で使っています。
私が作ったアプリケーションではパターンマッチングと画像回転の2つの処理を組み合わせた形でクリップ状の留め具の傾きを求めていましたが,今回は画像回転のみ解説していきます。
OpenCVによる画像の回転プログラミングを紹介 (Python)
OpenCVは非常に人気のある画像処理アルゴリズムです。簡単に接続したカメラから画像をアプリケーションに読み込めますし,主要な画像処理はほぼ簡単なプログラミングで実装できます。
画像処理の基本についてはこちらの記事で,OpenCVによる画像の読込などはこちらの記事で紹介していますので是非見ていってください。
さて,OpenCVによる画像の回転方法を早速紹介していこうと思います。使用するプログラミング言語はPythonです。
まず,ベースとなる画像は私の個人的趣味で2020年10月時点で絶賛大人気のVTuberである常闇トワ様の画像を使用させていただきます。本当に美しいですね。
こちらの画像をC:\Temp\towa.jpgという名前で保存して以下のプログラムを実行するだけで画像を任意の角度で回転させる事ができます。
import cv2
img = cv2.imread('C:/Temp/towa.jpg') #これでimgに画像データが入る
height = img.shape[0] #画像の高さ(ピクセル数)を取得
width = img.shape[1] #画像の横幅(ピクセル数)を取得
affin = cv2.getRotationMatrix2D((height/2,width/2),120,1) #回転の原点,回転角度,スケーリング値を指定する
dst1 = cv2.warpAffine(img,affin,(height,width)) #実際に画像を回転させる処理
cv2.imwrite('C:/Temp/Rotation120.jpg',dst1) #画像を保存
affin = cv2.getRotationMatrix2D((height/2,width/2),240,1) #回転の原点,回転角度,スケーリング値を指定する
dst2 = cv2.warpAffine(img,affin,(height,width)) #実際に画像を回転させる処理
cv2.imwrite('C:/Temp/Rotation240.jpg',dst2) #画像を保存
画像はcv2.imreadで画像を読み取り,cv2.getRotationMatrix2Dに画像の原点,回転させる角度,スケーリング(倍率)を指定してcv2.warpAffineで実際に回転させる,これだけです。
真ん中上側が元画像です。左下の画像がcv2.getRotationMatrix2Dで回転角120度を指定した場合,右下の画像が回転角240度を指定した画像です。
見ると分かるとは思いますが回転角度を指定すると,それに対して反時計回りに画像が回転しています。また,画像を回すと四隅の部分に黒い影がついてしまいます。この影の部分は回転角度に合わせて発生するので,プログラム上で黒い部分を任意の色に変えるといいです。
cv2.getRotationMatrix2D で指定できるパラメータ
前述したとおり,cv2.getRotationMatrix2Dで回転角を指定できる事は分かったと思います。そこでcv2.getRotationMatrix2Dに指定できるパラメータを詳しく解説しようと思います。
cv2.getRotationMatrix2D(center,angle,scale)・・・画像データを2次元変換させる
- center・・・画像の中心部分。ここを中心として画像を回転させる。基本的に取得画像の高さ,横幅の半値をとる
- sngle・・・回転させる角度。0~360で指定する。回転方向は必ず反時計回りになる。
- scale・・・画像に対する倍率。あまり使う事はない
この指定だけで簡単に画像データを回転させられます。実は中でやっている処理は大した物ではなく,この程度の関数は自作できます。ただOpenCVを使う事で自作する必要がなくなり,高速にアプリケーションを作れます。この高速という部分が業務では非常に助かるんですよね。
cv2.warpAffineで指定できるパラメータ
さて,実際に画像を任意の角度で回転させた後の画像データを取得するためのcv2.warpAffineを説明していこうと思います。
cv2.warpAffine(img,affin,outFileSize)・・・画像データを変換する
- img・・・入力元の画像データ
- affin・・・先のcv2.getRotationMatrix2Dで取得したデータ
- ouuFileSize・・・出力する画像のサイズ。元の画像サイズを指定する事が多い
非常に簡単ですよね。元画像とcv2.getRotationMatrix2Dの戻り値と出力先を指定するだけで簡単に画像を回転させられます。
実際にはこの一通りの処理にはアフィン変換という処理をしていて,行列演算をしています。ただ行列演算の中でも難しくはない内容ですし,そもそも画像処理アプリケーションを作る上では理解する必要はありません。そのため本記事でも解説を省きます。
本サイトでは簡単に画像処理を行う事ができるOpenCVの魅力について今後も記事を出していこうと思っています。是非他の記事も見ていってください。