ココロミにきみ

本と体とプログラミング

スキャン書類の傾き・回転修正ロジック

同一の多量の書類のスキャンにおいて、縦横にズレたり、回転した場合に自動的に正しい位置に戻すためのロジックを実際に作ったら上手くいった(当たり前だ)。Pythonで実装したがコードは書かずロジックだけ書く。

 

仕事で、AIで同一書類の数字(さらには文字)を読み取る際に、スキャンデータの位置ズレが普通に発生し、読み取り時のノイズが発生するのを防ぐのが目的だった。

f:id:molingit:20171002113252j:plain

↑こんな感じに修正される。

 

* * * * * * * * * * * * * * * * * * * * 

 

早速修正のロジックだが、スキャン時のズレには「横ズレ・縦ズレ・回転ズレ」があり、たいがいは複合のズレになっている。縦・横ズレの修正のほうが簡単だが、実はこれを先にやると二度手間になるので、実際の手順は

1.回転ズレ修正

2.縦横ズレ修正

で行う。説明は縦横ズレから行う。

f:id:molingit:20171002113257j:plain

こんな感じで普通にスキャン画像はずれる。なので、書類の枠組みを変更できる場合は目立たない程度に+記号などを枠外りに作り、その座標のズレを読み取ることで位置を修正する。変更できなければ書類の枠線などを使用する(と、できるんじゃないかな)

f:id:molingit:20171002113320j:plain

Pythonではcv2で読み取ってnumpyで行列にして、3cm角くらいの大きさで画像を切り取り、その中の+記号の中心をその座標とした。中心を見つけるには、切り取った3cm角の画像を行列にした際に、各行列の値0−255の中である閾値を超えたものの行列の座標を合計し、その平均を取った(実使用ではノイズがのる可能性がある)。

そして、理想の+座標と、実際の+座標のズレを引き算して、その分だけ行列全体をズラせばいい。理屈は簡単だけど落とし穴もある。

理想の+座標が意外に決まらなかったりする。元データがあるなら、それをPDFやJPGにパソコン上で変換して読みこめばいいと思いきや、その理想座標はスキャンで一番上手くいったデータとは全然違った。。。

* * * * * * * * * * * * * * * * * * * * 

さて回転修正。こっちのほうが数学的にめんどい。

f:id:molingit:20171002113302j:plain

こーゆーズレはけっこう頻繁におこる。ただし回転が5度を超えるようなズレは滅多に起こらないというか、そんなものはもう一度スキャンしてもらうほうがいいので、想定は2、3度のズレまで。(大きなズレは修正するための、指標の+が「読み取り3cm角」から外れてしまうので対応不可)

f:id:molingit:20171002113312j:plain

最初に説明した縦横ズレの際の、+記号を読み取るところまで同じで、今度は図にあるように、2つの+の座標をベクトルにする。

例えばB5用紙で、+記号を「上・真ん中」につけて、

・理想データ「上=O、真ん中=A 」

・スキャンデータ「上=O、 真ん中=B」

とすると、

 理想のスキャン時のOAベクトル=(1700,0)

 実際のスキャン時のOBベクトル=(1723,23)

みたいな値になる。単位はよくわからない。でそのベクトルがなす角θをアークサインと外積で求めることができる。アークコサインはオススメしない。

f:id:molingit:20171002113307j:plain

で、求めたこのθはラジアン表示なので、度数に直してscipyで回転させる。どうもこの処理が大変らしいので(けっこう時間がかかる)θが0.1(0.05くらい?)以下だったら回転修正させないというのもありかもしれない。

数字のイメージとして0.1は小さいけど、画像の回転としてはけっこう大きいので、B5サイズなら人間の目からしても0.1度は完全に回転ズレとして認識されてしまう(から外野が云々・・・)。あとはAIで読み取るさいにノイズがどの程度のるかで、無視すべき回転角度を実際の使用のなかで変えていく必要がある。

 

* * * * * * * * * * * * * * * * * * * * 

 

このように実際には回転修正をして、その後、縦横ズレ修正を行うと、最初に示した理想の位置にスキャン画像が整列してけっこううれしい。

ただ、実際にここに書いてあるようなことをやる人はその前に、PDFをJPGに直すところでも悩む気がする。僕は悩んだというか、ライブラリのバージョン対応などで時間をとても取られた。

まぁこれで、AIによる数字認識につなげて自動読み取りが本格的に動かせる状態になるので、ハッピーではある。みなさまの成功を祈りつつ。