ホームページ >バックエンド開発 >PHPチュートリアル >PHP で検証コード認識を実装する (中級)_PHP チュートリアル
前回の記事
この記事では、確認コードを特定するプロセスの手順を段階的に説明します。
一見すると、とても複雑に感じます。認証コードの画像の背景色は単色ではなく、毎回異なります。認証コード番号の色も毎回異なります。 2値化するのは難しそうに思えますが、実はRGB値を出力してみると簡単に分かります。認証番号の色がどのように変化しても、番号のRGB値は常に125未満の値となるため、以下のように判断されます
$rgbarray['red']
どこに数字があり、どこに背景があるのかが簡単にわかります。
このようなルールが見つかる理由は、検証コードのインターフェロンを作成する際、インターフェロンが数字の表示効果に影響を与えないように、インターフェロンのRGBとデジタルRGBが互いに独立している必要があるためです。そしてお互いに干渉しないこと。このルールを理解していれば、二値化は簡単に実現できます。
我々が見つけた120、80、125などの閾値は実際のRGBとは異なる可能性があります。そのため、検証コード上の数字の固定位置表示では、2値化後に一部の場所に1が表示されることがあります。あまりにも大きな意味。ただし、認証コードの位置が不確かな写真の場合、文字をカットするときに干渉が発生する可能性があります。そのため、二値化後にノイズ除去が必要となります。
2: 次に、音を立てて 2 番目のステップに進みます。乾燥の原理は非常に単純で、ノイズが比較的高く、必要な効率が比較的高い場合には、やるべきことがまだたくさんあります。幸いなことに、ここではそれほど深さは必要ありません。点が 1 の場合、その点の 8 つの方向の数が 1 であるかどうかを判断します。1 でない場合は、それが 1 であるかどうかを判断します。ドライポイントとみなされますので、1 に設定してください。
上の図に示すように、この方法を使用すると、赤いボックス内の 1 がドライ ポイントであることが簡単にわかり、それを直接 1 に設定するだけです。
判定する際にトリックを使用することがあります。ノイズが 2 つ連続する場合があるため、
[php:collapse] + ソースビューを展開 plaincopyprint?$num = 0;
if($data[$i][$j] == 1)
{
// 上
if(isset($data[$i-1][$j])){
$num = $num + $data[$i-1][$j];
}
// 下
if(isset($data[$i+1][$j])){
$num = $num + $data[$i+1][$j];
}
// 左
if(isset($data[$i][$j-1])){
$num = $num + $data[$i][$j-1];
}
// 右
if(isset($data[$i][$j+1])){
$num = $num + $data[$i][$j+1];
}
// 上左
if(isset($data[$i-1][$j-1])){
$num = $num + $data[$i-1][$j-1];
}
// 上右
if(isset($data[$i-1][$j+1])){
$num = $num + $data[$i-1][$j+1];
}
// 下左
if(isset($data[$i+1][$j-1])){
$num = $num + $data[$i+1][$j-1];
}
// 下右
if(isset($data[$i+1][$j+1])){
$num = $num + $data[$i+1][$j+1];
}
}
if($num == 0){
$data[$i][$j] = 0;
}
$num = 0;
if($data[$i][$j] == 1)
{
// 上
if(isset($data[$i-1][$j])){
$num = $num + $data[$i-1][$j];
}
// 下
if(isset($data[$i+1][$j])){
$num = $num + $data[$i+1][$j];
}
// 左
if(isset($data[$i][$j-1])){
$num = $num + $data[$i][$j-1];
}
//そうだね
if(isset($data[$i][$j+1])){
$num = $num + $data[$i][$j+1];
}
// 上左
if(isset($data[$i-1][$j-1])){
$num = $num + $data[$i-1][$j-1];
}
// 上右
if(isset($data[$i-1][$j+1])){
$num = $num + $data[$i-1][$j+1];
}
// 下左
if(isset($data[$i+1][$j-1])){
$num = $num + $data[$i+1][$j-1];
}
// 下右
if(isset($data[$i+1][$j+1])){
$num = $num + $data[$i+1][$j+1];
}
}
if($num == 0){
$data[$i][$j] = 0;
}
私はこの点の8方向の値の和を計算し、最後に他の和が特定の値より小さいかどうかを判断します
3: 去った後、我々は、乾燥した二値化されたデータを取得し、次に行われるのは、文字の切り出しである。文字、その後水平方向に多くの 0000 を去ります、次の図
最初に線路部分を切断し、二番目に線路部分を切断すると、独立した文字が得られる。ただし、この状況については後述する。 確認コードを作成するためのいくつかの提案 グール:
どこに数字があり、どこに背景があるのかを区別するのは簡単です。 このようなルールが見つかる理由は、検証コードのインターフェロンを作成する際、インターフェロンが数字の表示効果に影響を与えないように、インターフェロンのRGBとデジタルRGBがそれぞれ独立している必要があるためです。お互いに干渉しません。このルールを理解していれば、二値化は簡単に実現できます。 私たちが見つけた120、80、125などのしきい値は、実際のRGBとは異なる場合があります。そのため、検証コード上の固定位置に表示される数字には、2値化後に一部の場所に1が表示されることがあります。意味深すぎる干渉。ただし、認証コードの位置が不確かな写真の場合、文字をカットするときに干渉が発生する可能性があります。そのため、二値化後にノイズ除去が必要となります。 2: 次に、音を立てる 2 番目のステップに進みます。乾燥の原理は非常に単純で、ノイズが比較的高く、必要な効率が比較的高い場合には、やるべきことがまだたくさんあります。幸いなことに、ここではそれほど深さは必要ありません。点が 1 の場合、その点の 8 つの方向の数が 1 であるかどうかを判断します。1 でない場合は、それが 1 であるかどうかを判断します。ドライポイントとみなされますので、1 に設定してください。
一見すると、とても複雑に感じます。認証コードの画像の背景色は単色ではなく、毎回異なります。認証コード番号の色も毎回異なります。 2値化するのは難しそうに思えますが、実はRGB値を出力してみると簡単に分かります。認証番号の色がどのように変化しても、番号のRGB値は常に125未満の値となるため、以下のように判断されます $rgbarray['red']
上記の方法ではdw文字を1文字にカットしてしまいますが、これは間違ったカットなので、ここではノリ文字のカットを伴います。
4: 粘着文字の切断 検証コードを作成する場合、通常の文字の粘着は剥離しやすく、文字自体を拡大縮小すると、上記の文字の粘着は非常に困難であることがわかります。通常のキャラクター接着なので、この状況に対処する非常に簡単な方法も使用します。切り出し操作が完了した後、切り出した部分が文字であるかどうかを検証する必要があります。このしきい値を選択する基準は、切り取られた文字の幅であるかどうかです。キャラクターがどのように回転されても、変形はこのしきい値を超えないため、切り取ったブロックがこのしきい値より大きい場合、その合計が大きい場合は、接着されたキャラクターであると見なされます。 2 つのしきい値の場合、3 つの文字が接着されていると見なされます。このルールを知っておけば、ベタ文字をカットするのはとても簡単です。それが貼り付けられた文字のブロックであることがわかった場合は、そのブロックを 2 つ以上の新しいブロックに分割するだけです。もちろん、文字をより適切に復元するために、通常は +1 と -1 を使用して文字ブロックを適切に補完します。
5: 上記の 4 つのステップの後、比較的純粋な文字ブロックを抽出できます。次のステップは文字を照合することです。回転された文字の特徴コードを確立するには多くの方法があるため、ここでは詳しく説明しません。ここで使用する最も簡単な方法は、すべてのキャラクターのすべての状況に対応するライブラリを構築することです。そのため、提供したコードに調査操作を追加しました。その目的は、最初に画像の検証コードを手動で識別し、次にその調査結果を使用することです。書き込むメソッド フィーチャーコードライブラリを入力します。この方法で書き込まれる画像データが増えるほど、より正確な行を検証して識別できるようになります。
上記の手順を完了すると、基本的に今日のインターネット上のほとんどの確認コードを識別できます。ここでは、OCR の知識をまったく使用せずに最も簡単な方法を使用します。これらの方法は、非 OCR 分野の頂点に立つ必要があります。より複雑な検証コードを識別したい場合は、より多くの OCR の知識が必要です。機会があれば上級編で一つずつ紹介していきたいと思います。
以下に、Web サイト管理者の注意を引くことを目的とした、識別しやすい確認コードをいくつか示します。
検証コードを識別するプログラムにとって、最も困難な部分は検証文字の切断と特徴コードの確立です。多くの国内プログラマーは検証コードのみを作成する際、常に検証コードに大量のインターフェロンや干渉線を追加することを好みます。言わないと効果に影響しますので、この人に確認コードを認識されにくくしたい場合は、次の 2 つの点を実行するだけです。
1: キャラクターの接着、できればすべてのキャラクターに接着パーツがあります
2: 指定文字を使用しないでください。検証コードの各部分で異なる拡大縮小率または回転率を使用します。
この 2 点が達成されるか、この 2 点の変形が達成される限り、認識プログラムが識別することは困難になります。 YahooとGoogleの認証コードを見てみましょう。黒い背景に白い文字が描かれていますが、認識するのは困難です。
ヤフー:
ソース ファイルの下: クリックしてダウンロード http://www.BkJia.com/uploadfile/2012/0316/20120316111107739.rar
uggのコラムより抜粋