OpenCVによる台形補正・射影変換を解説【Python】

OpenCVによる台形補正・射影変換を解説【Python】 プログラミング

OpenCVを使えば、次のように画像を切り抜くことが可能です。

一般的には、台形補正・射影変換(透視変換)とも言われます。
個人的には、台形補正という表現がわかりやすいと思います。
以下では、台形補正で呼び名を統一します。

この記事では、OpenCVによる台形補正のやり方を解説しています。

本記事の内容

  • OpenCVで台形補正を行うための環境
  • 【サンプルコード】OpenCVによる台形補正
  • 実例で比率調整を行う

それでは、上記に沿って解説していきます。

OpenCVで台形補正を行うための環境

この記事では、PythonでOpenCVを利用しています。
そして、OpenCVのインストールに関しては、次の記事を参考にしてください。

おそらく、ここまでは準備できているはずです。
では、GIMPはどうでしょうか?

実は、GIMPだけでも台形補正を行うことは可能です。
次の記事では、GIMPによる台形補正を解説しています。

じゃあ、なぜOpenCVで台形補正を行う必要があるのか?
それは、上記の記事に詳細を記載しています。

記事の内容を簡単にまとめると、次の一言です。
「GIMPの台形補正はレベルが低い」

どれくらいレベルが低いかと言うと、次の画像を見ればわかります。

左が、GIMPで台形補正したモノです。
右が、OpenCVで台形補正したモノです。

明らかにレベルが違いますよね。
もちろん、GIMPでもいろいろと工夫すればOpenCVと同じようなモノが作れるかもしれません。
しかし、GIMPでは、見た限りだとワンタッチ(お手軽)にはできませんでした。

そうなると、「イラストレーターならどうなのか?」と興味はあります。
ただ、プログラマーにはイラストレーターは高額過ぎます。
そして、オーバースペックです。

話をGIMPに戻しましょう。
そのGIMPは、座標を取得するために利用します。
座標というのは、次の赤丸の部分です。

この4点の座標を取得するために、GIMPを利用します。
GIMPのインストールに関しては、上記で紹介した記事内で説明しています。

なお、座標が取得できるなら、別にGIMPである必要性はありません。
ここまで準備ができたら、実際にプログラムで台形補正をしていきます。

【サンプルコード】OpenCVによる台形補正

次のコードを実行すれば、台形補正が実行できます。

import cv2
import numpy as np
import math

# 比率調整
w_ratio = 1.1

# 入力画像のパス
input_file_path = "./data/test.jpg"  
# 出力画像のパス
output_file_path = "./data/output.jpg"   

# 変換前4点の座標 p1:左上 p2:右上 p3:左下 p4:左下
p1 = np.array([267, 960])
p2 = np.array([2544, 378])
p3 = np.array([216, 1494])
p4 = np.array([2592, 1053])

# 入力画像の読み込み
img = cv2.imread(input_file_path)

# 幅取得
o_width = np.linalg.norm(p2 - p1)
o_width = math.floor(o_width * w_ratio)

# 高さ取得
o_height = np.linalg.norm(p3 - p1)
o_height = math.floor(o_height)

# 変換前の4点
src = np.float32([p1, p2, p3, p4])

# 変換後の4点
dst = np.float32([[0, 0],[o_width, 0],[0, o_height],[o_width, o_height]])

# 変換行列
M = cv2.getPerspectiveTransform(src, dst)

# 射影変換・透視変換する
output = cv2.warpPerspective(img, M,(o_width, o_height))

# 射影変換・透視変換した画像の保存
cv2.imwrite(output_file_path, output)

コメントを参考にしてコードを見れば、大体のことはわかるはずです。
コメント内では「射影変換」「透視変換」というワードを用いています。

プログラム(関数)的には、こっちの表現の方が適切だと考えています。
台形補正は、わかりやすさ優先の表現と言うことです。

基本的には、次の部分以外はコードを触る必要はありません。

# 比率調整
w_ratio = 1.1

# 入力画像のパス
input_file_path = "./data/test.jpg"  
# 出力画像のパス
output_file_path = "./data/output.jpg"   

# 変換前4点の座標 p1:左上 p2:右上 p3:左下 p4:左下
p1 = np.array([267, 960])
p2 = np.array([2544, 378])
p3 = np.array([216, 1494])
p4 = np.array([2592, 1053])

比率調整は、後で説明します。
まずは、入力画像ですね。

もちろん、台形補正する前の元画像のことです。
元画像のパスを設定します。

ただし、元画像は大きいサイズの方がよいでしょう。
その方が、台形補正した出力画像も解像度が良いモノになります。
また、4点の座標(赤丸)は、元画像をベースに測定した座標となります。

そして、最後に比率調整の説明です。
これは、以下で解説します。

実例で比率調整を行う

比率調整の説明を行います。
実際の例で説明していきます。

上記の画像から、グリコの部分を上記のプログラムを使って台形補正します。
その際、比率調整を6段階で設定。

左から、1.0、1.1、1.2、1.3、1.4、1.5。

この中では、比率調整1.4(右から2番目)が最も実物に近いかもしれません。
このような調整を行う場合に比率調整を利用します。

OpenCVを使えば、精度の高い台形補正(射影変換・透視変化)を簡単に行うことができます。
これで新人のA君も救われます。

「A君?」と疑問に思う方は、上記でも案内した次の記事をご覧ください。

タイトルとURLをコピーしました