つれづれなる備忘録

日々の発見をあるがままに綴る

OpenCVの使い方8 ~ 台形補正

 今回はOpenCVを使った台形補正処理の方法について紹介したい。

1. 台形補正

台形補正とは、撮影角度によって斜め・台形になった画像を正面から撮影したように補正する処理のことで、多くの画像処理ソフトなどに実装されている基本的な画像処理の1つになる。

OpenCVの処理に流れは、以前紹介した幾何変換と同様で、

atatat.hatenablog.com

変換前の座標点と変換後の座標点から変換行列(台形補正の場合はcv2.getPerspectiveTransform)を求めて、補正する画像に変換(cv2.warpPerspective)を適用する。

今回は画像やコードは以下を参考にして台形補正を実行した。

self-development.info

2. 変換座標の取得

 テスト画像を読み込んで表示させると以下のようになる。

サンプル画像読み込み

import cv2
import numpy as np
from matplotlib import pyplot as plt
from google.colab import files
uploaded_file = files.upload()
uploaded_file_name = next(iter(uploaded_file))
orig = cv2.imread(uploaded_file_name)
src = cv2.cvtColor(orig, cv2.COLOR_BGR2RGB)
plt.imshow(src)

"テスト画像"
テスト画像

テスト画像中の赤丸で示している4点を正面から見た長方形4点に変換する変換行列を求めて画像データに適用することで台形補正を行う。

なお使用している画像サイズは上記のリンクと異なるため、ペイントなど画像座標が表示されるソフトを用いて赤丸4点の座標を調べると左上p1(46,159), 右上p2(421,64), 左下p3(38,246), 右下p4(428,174)となった。 変換後の座標は、幅を左上p1、右上p2、高さを左上p1、左下p3の長さをnp.linalg.norm()で取得しint型にすることで、長方形4点の座標を得る。変換前後の4点の座標を配列ori_cor,dst_corとして格納する。 具体的には以下のようにコードを記述する。

p1 = np.array([46,159]) #左上
p2 = np.array([421,64]) #右上
p3 = np.array([38,246]) #左下
p4 = np.array([428,174]) #右下

o_width = np.linalg.norm(p2 - p1)
o_width=int(np.floor(o_width))
o_height = np.linalg.norm(p3 - p1)
o_height=int(np.floor(o_height))

ori_cor = np.float32([p1, p2, p3, p4])
dst_cor=np.float32([[0, 0],[o_width, 0],[0, o_height],[o_width, o_height]])

3. 台形補正

 変換前、後の4点の座標を格納した配列ori_cor,dst_corから台形補正に用いる変換行列Mを cv2.getPerspectiveTransform(ori_cor, dst_cor)により得たあと、cv2.warpPerspective(src, M,(o_width, o_height)) により画像データに適用する。

M = cv2.getPerspectiveTransform(ori_cor, dst_cor)
cor_src = cv2.warpPerspective(src, M,(o_width, o_height))

plt.imshow(cor_src)

台形補正後の画像は以下のようになり、斜めになっていた看板が正面から撮影したような画像に変換されている。

"台形補正後の画像"
台形補正後の画像

4. まとめ

 今回はOpenCVを用いた台形補正処理の方法について紹介した。基本的には変換前後、4点の画像上の座標を指定して変換行列を取得、あとは補正する画像データに適用するという流れで台形補正を実行することができる。