2012-03-21 10 views
2

これは、質問がフォローアップのPrepare complex image for OCRです。エッジとフィールドをマージする

私は数字と画像のキャニーエッジ検出器の出力を持っている:あなたが見ることができるように

Canny edge image

、私はクレジットカードのエンボスから生じる桁のための様々なエッジを持っています。目標は、文字認識に適した実数の桁を持つことです。

これは、ダイヤモンドの形をした5×5の構造要素との形態学的に近い操作を使用して数字を「埋める」ための試みである:

Morphological close operation

私は、しかし、多くの成功なしに、様々な構造要素を試してみました。穴がどのように作成されているか(数字9と0)、図形が歪んでいる(数字3)ことがわかります。

構造を塗りつぶすのに適した方法をお勧めしますが、異なる桁を接着したり、元の形状を維持したりする必要はありませんか?

しかし、見栄えの悪い数字であっても、終了操作を適用した後で垂直に数字を分割しても、既に良好な認識結果が得られている。

おかげで、 バレンティン

+0

バレンタイン、私はあなたと同じ問題(OCRでクレジットカードを読む)に取り組んでいます。私は手作業による前処理の後でイメージを読むためにtesseractを使っていくつかの成功を収めましたが、私はまだそのプロセスを自動化することに苦労しています。 あなたは最終的に解決した解決策を知りましたか?あなたのコードはどこからでも入手できますか?私はあなたとノートを比較したいと思います。 – bjmc

+0

私にメールを送ることができます(www.valentin-manthei。あなたが望むならば)。テンプレート/フィーチャマッチング技術と結果を改善するための追加の基準を使用して、独自のアプローチでOCRを実現しました。しかし、前処理は最悪の部分です。パラメータを動的に調整するフィルタチェーン全体が、最終的には良い状況(落雷、分解能)の下でのみ、一部のクレジットカード番号を完全にスキャンすることができます。 – valentin

答えて

2

enter image description here私は、あなたは大きなカーネル(私は50×50を使用)とsauvolaの二値化のような、高度なグレースケールの2値化手法でより良い結果に達することができると思います。このスレッシュホールドフィルタは、グレースケール値のローカル分散を考慮に入れ、リミナンスの変化には敏感ではありません。また、設定に応じていくつかのハイパス/ローパス特性があります。 JavaOCRプロジェクトでの実装を参照してください:

http://sourceforge.net/projects/javaocr/

(PS:50×50カーネルは問題ではありません - この実装速度が独立したカーネルサイズです)

更新、ちょうど値化、クレジットカードに私のOCRダイヤラを試してみましたが結果は以下の通りです:

表面を反射するとノイズが大きくなりますが、これを処理するにはもう少し前処理が必要です。

+0

ありがとうございます。これは40x40のカーネルとsauvolaアルゴリズムの結果です:http://i.imgur.com/QWlPc.jpg(JavaOCRではsauvolaソースは見つかりませんでしたが)。結果は非常に騒々しいですが、おそらく適用されたガウスのぼかしで最適化することができます。しかし、これが文字認識には適していない部分桁の問題をどのように解決するかはわかりません(私はすべてのアプローチで輪郭を取得するだけです)。 – valentin

+0

sauvolaはwidnowに対してMxと分散を使用するため、すでにローパスフィルタのプロパティを持っています。しかし、プラスチック表面を反射する銀色には不十分です。このサンプルでは、​​私のスライスコードでグリフを抽出することはできませんでしたが、私がJavaOCRで使用する確率ベースの認識は、画像が歪んでいてもクレジットカード番号のフォントではうまく機能するはずです –

1

あなたはコードを表示していないので、あまりにも助けてはいけません。ここでは、いくつかの形態学的操作を使用して、canny操作を試す前にサイズを変更せずにいくつかのギャップを埋める方法の抜粋です。

// OTSU, then binary threshold 
Imgproc.threshold(colorImg, grayImg, 0, 255.0, Imgproc.THRESH_OTSU | Imgproc.THRESH_BINARY); 

// Morphological reduction of noise, strengthen lines 
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(7, 7)); 
Imgproc.dilate(grayImg, grayImg2, element); 
Imgproc.erode(grayImg2, grayImg, element); 

// Edge detection 
Imgproc.Canny(grayImg, output, 50, 50); 

ただし、クレジットカードを読み取る、card.ioをご覧ください。照明があまり変わらないので、エンボスシンボルを読み取ることは、事前画像処理では非常に困難です。機械学習を使う方が良いです。