ハミング距離を使用してテキストを認識する

この記事は、Alex Povetkinの記事「 潜在的な関数の方法によるパターン認識 」によって促されました。



そこで、Delphiでプログラムを作成します(バージョン6を使用しています)。これは、画像の文字をテキストに変換できます。 このタスクはインターネット上で非常に人気があり、各投稿に対して「 文字認識を実装したい!!! インターネットで読む 「最も一般的な回答」を「または」 処理しない、ファイルリーダーを使用するなどを 支援 します



私は、他の多くの人と同様に、基本的なアルゴリズムを研究することから始めました。 もちろん、FineReaderのようなモンスターはアルゴリズムコンポーネントに多額のお金を費やしており、その秘密はわかりませんが、基本的な方法を理解するためのその他の情報はかなりあります。 しかし、遠くから始めましょう。





認識の本質は、画像との比較です。



子供の頃、テキストを見ていると、写真しか見えません。 写真は単なる写真ではなく、テキストであり、単なるテキストではなく、ある種の物語であることを理解するために、分析に必要な基準にまだ恵まれていません。 私たちは成長し、シンボルの画像を受け取り始めます。文字「A」の付いた写真は、汽船ではなく文字Aを意味することがわかります。 年をとると、画像のベース(または画像の基準のベース)が得られます。比較と分析により、どのシンボルが目の前にあるかがわかります。

コンピューターとまったく同じ状況。 最初に、彼は単純に記憶にある写真を受け取り、その上のいくつかの領域を検索し、それらの領域を自分のベースと比較して分析を行います。その結果は画像内のシンボルの決定になります。 つまり、すべてが単純です。画像をメモリに転送し、画像内のいくつかの領域を探し、データベースと比較しますが、画像を比較する方法はまだ明確ではありません。 インターネットにアクセスします。



比較方法



最新の画像比較方法は、次の2つのカテゴリに分類されます。



1.規格との比較

2.基準の比較



そして、両方の場合に適用できるため、ニューラルネットワーク法はそれらの間で区別されます。 私たちはそれを使用せず、その作業を検討しません。できるだけシンプルで明快なことをすべて行うようにします。



基準による比較は、シンボルの特性を決定するアルゴリズムタスクを実行するのが難しく、そのようなアルゴリズムの効果はおそらく小さいため、最も時間がかかります。 これは文字の類似性によるものであり、低解像度のテキストを認識した場合、そのようなアルゴリズムをホーニングするコストは何倍も高くなります。 しかし、このような困難なタスクについては、解決策のあるソースが見つかりました。



黒い領域の存在について極値と曲げ点をチェックする単純なプログラムのソースも見つかりました。

郵便番号の認識

Yandex画像認識(CY)



プログラムデータの認識の問題は明らかです-画像が一致しない場合(ノイズ、異物など)、これらのプログラムは無効です。 ただし、割り当てられたタスクの狭いサークルに対処します。 認識の実装のより一般的な例を取得したいと思います。



標準との比較は、より単純で効率的なタスクです。 ここでは、すべてが可能な限り単純です-参照画像を作成し、それらを比較します。 ピクセルごと、オーバーレイ、オーバーレイオーバーレイなど、多くの比較方法があります。 インターネットには、このトピックに関する記事がたくさんあります。 最も興味深い作品:

移動ロボットによるパターン認識

画像認識におけるニューラルネットワークの使用

最も単純なグラフィックパターン認識アルゴリズムの実現



ピクセルごとの最も単純な比較方法を使用します。 一番下の行は、2つの黒と白の画像の2つの対応するピクセルの代替比較です。 2つのピクセルは適切でなければならないため、写真は同じサイズでなければなりません。



比較は非常に長いアルゴリズムであるため、100x100ピクセル(10,000回の比較操作)などの2つの画像を比較するためにプログラムの作業を最適化する必要がありますが、もっと小さいがまだ関連性があります(8x8ピクセルの画像を比較し、文字を区別することは非常に困難です)したがって、ピクセルの数が多いほど、正しい認識の可能性が高くなり、アルゴリズムに必要な時間が長くなります)。 実験的に、最適なサイズ(16x16ピクセル)が選択されました。 ただし、サイズを変更する前に、変更するものを見つける必要があります。



セレクション



関数TForm1.PreParse1(図:TPicture)を参照してください:文字列;

したがって、画像内のシンボルを見つけて、それらすべてを見つける必要があります。 これを行うには、画像を白黒に変換し( 手順TForm1.Mono(Bmp:TBitmap)を参照)、すべてのオブジェクトが仮想文字の極端なピクセルとの比較を通じて検索されます。 見つかった各文字の周りに赤いフレームが作成されます。このフレーム上で画像のサイズが変更され(StretchBlt関数)、比較のためにコピーされます( 関数TForm1.Parce3を参照してください(図:TPicture; x1、y1、x2、y2:整数):TBitmap ;



比較アルゴリズム



関数TForm1.ParceBMP(bmp1:Tbitmap):stringを参照してください。

アルゴリズムは単純です-ピクセルごとに比較します関数TForm1.Compare(b1、b2:TBitmap):integerを参照)、2つのピクセルが異なる場合(一方は黒、他方は白)、カウンターRを増やします。2つの画像を完全に比較した後、式のカウンターを置き換えます 画像



比較の結果として得られた値は、 ハミング距離と呼ばれます。

次に、この式を使用してさまざまな比較を行う計算結果の配列を作成します(すべての標準を使用した画像)。 配列と対応する文字の最大値を取得します。 これが結果です!



ベースを作成する



プログラムの次の段階は、データベース(シンボルレコードの配列とそのグラフィック表現)のコンパイルです。 ソースコードで、グラフィックエディターを使用せずにロシア語の文字と数字の画像の標準データベースを作成します。 これを行うには、画像を目的のサイズに設定し、キャンバスモードを開いて、画像に必要な文字を書き込む必要があります。

元の画像を処理するのと同じ方法で結果の画像を処理する必要があります。そのため、標準は認識された画像に可能な限り近く、その逆も同様です(以下を参照)。



Var

myarray:array of record //

ch:char; //

bmp:TBitmap; //

end;

i : integer; //

Img:TBitmap; //()

im:TPicture; // ,

begin

SetLength(myarray, 73);//

im:=TPicture.Create; //

Img:=TBitmap.Create;

for i := 0 to 31 do

with Img.Canvas do //

begin

Img.Height:=16; //

Img.Width:=16;

Brush.Color := clWhite; //

Pen.Color := clWhite;

Rectangle(0,0,16,16); //

Pen.Color := clBlack; //

Font.Color := clBlack;

Font.Charset:=form1.FontDialog1.Font.Charset; // ( )

Font.Size := Form1.FontDialog1.Font.Size;

Font.Style := Form1.FontDialog1.Font.Style;

Font.Name := Form1.FontDialog1.Font.Name;

TextOut(0, 0, CHR(ORD('')+i));//

myarray[i].bmp:=TBitmap.Create;//

myarray[i].ch:=CHR(ORD('')+i);//

im.Bitmap.Assign(Img);//

myarray[i].bmp:=PreParse2(Im);// (

end;








間違い



それらなしでどこに? 認識エラーを処理する方法も必要です。 これを行うには、認識の前に、文字とプログラムの結果を表示する特別なボタンを作成し、認識が正しいかどうかを確認する必要があります。 「はい」の場合は何もせず、それ以外の場合はデータベースに入力します。構造は次のとおりです。データベース内の文字数が指定されているインデクサーファイル、次の行は文字、画像ファイルへのリンク( 手順TForm1.Learn(Pic: TPicture); )。



簡単なブロック図



画像



実装



タスクを定義し、フォームを描画します。

画像



受信したソースはこちらです。



スクリーン実行プログラム:

画像



不足しているものまたは将来の計画



-プログラムは、Y、Yの2つの数字で構成される文字を認識できません。

-回転/ノイズ/その他の認識が正しくない場合。

-時々、小さい文字を大きい文字、小さい文字として認識します(実際にはこの方法では論理的です)



おわりに



したがって、テキストの次の「認識子」が書き込まれます。 誰が使用しますか? 実質的に誰もいません。 これはFineReaderでもCuneiformでもありません。 ここでのすべては、はるかに単純で理解しやすく、効果が低くなっています。 しかし、それにもかかわらず、この記事がITコミュニティに役立つことを願っています。 このシステムは、他のニーズに合わせて変更できます。



近い将来、認識結果のグラフでストーリーを補足し、この認識方法を他の方法と比較したいと思います。



執筆中に、次の資料が使用されました。

ポテンシャル関数法を使用したパターン認識

郵便番号の認識 (写真を選択するためのアルゴリズムが使用されます)



UPD:データベースに問題があったので、 AmoNのおかげでソースコードをリロードすることにしました






All Articles