RIPOC概要

OpenCV By Output不足なエンジニア

前回の続きです。 今回はRIPOCの概要について記載します。RIPOCは回転不変位相限定相関法といい、POC(位相限定相関法)を応用した回転・拡大縮小を考慮した手法です。



POCとRIPOCについて

POC

そもそもPOCとは、画像にフーリエ変換を施すと振幅(濃淡)と位相(輪郭)が抽出されるので位相の相関から画像のマッチングを行う手法です。詳しくは解説論文に記載があります。
Pythonで実行するなら、cv2.phaseCorrelate関数を使用します。

import cv2
import numpy as np
# np.float32 に変換しないとPOCが実行できない
img1 = np.float32(cv2.imread('base_img.png',0))
img2 = np.float32(cv2.imread('written_img.png',0))
# 差分の抽出
dx, dy = cv2.phaseCorrelate(img1,img2)

RIPOC

X, Y 方向の差分は上記で抽出することができます。では回転や拡大縮小されている場合はどうするかというと、X,Y 方向が拡大縮小と回転を表すように座標変換してあげれば良いわけです。つまりあらかじめ極座標変換しておいてからPOCします。(細かいことを言うと対数極座標変換してからPOCします。) $$ x = r \cos \theta \\ y = r \sin \theta $$ 極座標変換することでX, Y の座標情報がR(拡大縮小), θ(回転)情報に置き換わるイメージですね。素晴らしい発想だと思います。この対数極座標変換してからPOCを実行するのは意外とソースが多くなるので、私はこちらを参考にさせていただきました。 ちなみにフーリエ変換して極座標変換した画像は下記のようになります。

このぐにゅって曲がった世界でのX,Y方向のずれが元(極座標変換する前)の世界でのR,θに変換されます。ちなみにこれらは下記画像の白黒反転したものが入力になっています(傾きが分かりにくいので、ブログ用画像には緑の補助線を追加しています。計算結果によると傾きは「 -0.09843750000000001」です。よく見ると右側は傾きが大きいだけでなく紙が曲がっていることもわかると思います)。

スキャンずれ修正と差分抽出への応用

画像のスキャンずれを修正する際はまずRIPOCで回転を修正して、その後POCで位置を修正することで、ある程度ずれを修正することができます。実際は紙が曲がった状態でスキャンしているので直線であるはずの枠線が曲線になるため重ねてみると若干ズレが残ります。このズレを極力無くすためには、画像を複数のタイルに分割してタイルごとにズレ修正してしたほうが良いと思います。ただ、目的はテンプレート画像との差分箇所(帳票の記入箇所)の座標取得です。2枚の画像から枠線等の記入しなくても存在する部分を除去した残りが欲しいだけなので、2枚の画像を重ねるときに全ての線を太く膨張(dilation)させておき、重なった部分を削除してからすべての線を縮小(erosion)させることで対処できます。(その代わり閾値調整が必要になり、汎用性が落ちる…)
dilation と erosion は次回記載予定です。

若干ノイズが残っていますが、全部やると(尚且つ紙の歪みが小さいと)こんな感じに差分が抽出できます。実際は紙の歪みが大きくなるとただの枠線も差分として抽出してしまうので単品での記入箇所特定は困難です。閾値調整もありますし。tesseract等の他の方法と組み合わせれば有効に使えるのではないでしょうか。

余談

フーリエ変換は時間tから周波数ωへの写像ですので、画像の周波数が得られます。画像の周波数ってなんだよって感じですが、画素の変化度合いのようなものみたいです(単位ピクセル移動したときの画素の変化が大きいところは周波数が高く、変化が少ない箇所は周波数が低くなる)。周波数が低い部分のみ重点的に取り出すなども可能なので、興味があったら試してみると良いと思います。例えばノイズがある部分は画素変化が大きくなるので、画素変化が少ない(周波数が小さい)部分を重点的に抽出するローパスフィルタを使いノイズ除去することがあるようです。こちらが分かりやすいです。

OpenCVは充実した画像処理ライブラリなので、とりあえず関数を呼べば何とかなってしまいます。POCがどうやって実現されているかちょっと知るだけでノイズ除去等の別問題に応用できる知識が得られるので、ただ関数を呼び出して満足しないようにしたいです。(というか、そういう時間的余裕を作れるように努力したい。)


カテゴリー:OpenCV,python,画像処理

Output不足なエンジニア

統計が好きになれず、機械学習やったら必然的に統計が必要になるだろうと思ったら想像以上に機械学習にハマる。数学は芸術なので商売にするつもりはないけど、DeepLearningは数学じゃないし商売にしたいと思っているところ。画像処理がメイン。