射影ヒストグラムを用いた文書画像の回転補正(2)
はじめに
前回、射影ヒストグラムを用いて文書画像の回転補正を行いました。
今回は、実際のカメラを用いてリアルタイムで文書画像の回転補正をしたいと思います。
いきなりですが、今回作ったプログラムの実行例を以下に示します。
こんな感じに、カメラが傾いていても文書画像が正面を向くように自動補正していきます。
回転補正アルゴリズム
提案法はとてもシンプルなプロセスで実行されます。
まずはじめに、入力画像を徐々に回転させながら正面度を測ります。
そして、一定の範囲で回転させた後、最も正面度が高い回転角を求めます。
最後に、その回転角より求めた回転行列を用いて、画像を補正します。
画像の回転
画像の回転はOpenCVにあるアフィン変換関数を用いて行います。
特に変わったことはやっていないので、コードをそのまま張ります。
for angle in np.arange(-20, 20, 1): R = cv2.getRotationMatrix2D((w//2, h//2), angle, 1.0) dst = cv2.warpAffine(th, R, (w, h), flags=cv2.INTER_CUBIC, borderValue=(255, 255, 255))
回転補正は±20°の範囲に設定しました。ここの数字は実行シーンに応じて適宜決めるべきですが、今回はえいやで決めてしまいました。
また、boarderValueで画像回転時の背景色を白に指定しています。これは文字色を黒、背景色を白としている為です。
正面度の計算
正面度は「文章の行がうまく抽出できてそう度」を定量化したものです。
前回は何も考えずに射影ヒストグラムの総和を取りましたが、今回はもう少し頭を使ったものを実装してみます。
以下に、正面を向いた時とか回転時の射影ヒストグラムの例を示します。
正面 | 回転 |
---|---|
このように、正面を向いていたらシマシマが現れます。
シマシマ度合いをいい感じに定量化できればよいのですが、ちょっと思いつかなかったので今回は、「正面を向いていると白い空間が増える」という性質を利用します。
具体的な処理としては、しきい値以下となる領域をカウントしました。
以下にコードを記載します。
def get_cost(hist): threshold = 10 count = np.where(hist < threshold)[0].shape[0] return count
実際のデータを用いて正面度の振る舞いを観察してみます。
一目瞭然ですね。(前回の正面度はたまたま、あのデータにフィットしていた説がありますネ)
また、今回の正面度は10度の所にピークが立っています。以下に入力画像と10度回転させた画像を示します。
入力画像 | 10度回転させた画像 |
---|---|
いい感じに補正できている事が確認できました。
実行例
Web Cameraで文書画像を撮影しながら、リアルタイムで回転補正をしてみました。
処理時間は0.19[s]なので、リアルタイムと言っても問題なさそうな感じがします。
左が入力画像です。適当に回転させながら撮影している様子が確認できると思います。
右が回転補正を行った結果です。ところどころ処理がちらつく時がありますが、正面になるように補正されている事が確認できます。
まとめ
射影ヒストグラムを用いてリアルタイム回転補正を実装しました。
リアルタイムにそこそこな精度で回転補正ができているため、概ね満足です。
次は、この回転補正を用いることでtesseractの文字認識精度がどう変わるか確認してみたいです。