ホームページ > バックエンド開発 > PHPチュートリアル > PHP で検証コード認識を実装する (中級)_PHP チュートリアル

PHP で検証コード認識を実装する (中級)_PHP チュートリアル

WBOY
リリース: 2016-07-13 17:49:44
オリジナル
970 人が閲覧しました

前回の記事 > では、単純なコードを識別する方法について説明しました。検証、ここで簡単なのは、検証コードが数字と文字で構成され、統一された形式を持ち、出現するたびに固定位置になるということです。この記事では、検証コードの識別について詳しく研究していきます。この識別の目的は、検証コードが文字と数字で構成され、位置が固定されていないことです。文字間の癒着があり、検証コードには強力なインターフェロンが含まれています。この記事で説明する方法は普遍的な解決策ではなく、提供されたコードで問題を直接解決できるわけではありません。確認コードの特定は特定の方法とは関係がないことに注意してください。これは、PHP 言語を使用してのみ実装されます。ここで紹介する方法を使用して、任意の言語を使用して実装できます。

この記事では、確認コードを特定するプロセスの手順を段階的に説明します。




上の図に示すように、以降の説明ではこの図を中心に説明します。
1: 認証コードを取得したら、一見すると最初に行う必要があるのは、それを 2 値化することです。検証コードの部分は 1 で表され、背景部分は 0 で表されます。識別方法は非常に簡単です。検証コードのメイン画像の RGB を出力し、その RGB ルールを解析します。この画像の R 値は 120 より大きく、G と B の値は 80 未満であるため、このルールに従って上記の画像を簡単に 2 値化できます。初級編で特定された2枚の写真を見てみましょう


一見すると、とても複雑に感じます。認証コードの画像の背景色は単色ではなく、毎回異なります。認証コード番号の色も毎回異なります。 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 を去ります、次の図




 

最初に線路部分を切断し、二番目に線路部分を切断すると、独立した文字が得られる。ただし、この状況については後述する。



上記の方法では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のコラムより抜粋




一見すると、とても複雑に感じます。認証コードの画像の背景色は単色ではなく、毎回異なります。認証コード番号の色も毎回異なります。 2値化するのは難しそうに思えますが、実はRGB値を出力してみると簡単に分かります。認証番号の色がどのように変化しても、番号のRGB値は常に125未満の値となるため、以下のように判断されます

$rgbarray['red']

どこに数字があり、どこに背景があるのか​​を区別するのは簡単です。

このようなルールが見つかる理由は、検証コードのインターフェロンを作成する際、インターフェロンが数字の表示効果に影響を与えないように、インターフェロンのRGBとデジタルRGBがそれぞれ独立している必要があるためです。お互いに干渉しません。このルールを理解していれば、二値化は簡単に実現できます。

私たちが見つけた120、80、125などのしきい値は、実際のRGBとは異なる場合があります。そのため、検証コード上の固定位置に表示される数字には、2値化後に一部の場所に1が表示されることがあります。意味深すぎる干渉。ただし、認証コードの位置が不確かな写真の場合、文字をカットするときに干渉が発生する可能性があります。そのため、二値化後にノイズ除去が必要となります。

2: 次に、音を立てる 2 番目のステップに進みます。乾燥の原理は非常に単純で、ノイズが比較的高く、必要な効率が比較的高い場合には、やるべきことがまだたくさんあります。幸いなことに、ここではそれほど深さは必要ありません。点が 1 の場合、その点の 8 つの方向の数が 1 であるかどうかを判断します。1 でない場合は、それが 1 であるかどうかを判断します。ドライポイントとみなされますので、1 に設定してください。

一見すると、とても複雑に感じます。認証コードの画像の背景色は単色ではなく、毎回異なります。認証コード番号の色も毎回異なります。 2値化するのは難しそうに思えますが、実はRGB値を出力してみると簡単に分かります。認証番号の色がどのように変化しても、番号のRGB値は常に125未満の値となるため、以下のように判断されます

$rgbarray['red'] どこに数字があり、どこに背景があるのか​​を区別するのは簡単です。

このようなルールが見つかる理由は、検証コードのインターフェロンを作成する際、インターフェロンが数字の表示効果に影響を与えないように、インターフェロンのRGBとデジタルRGBがそれぞれ独立している必要があるためです。お互いに干渉しません。このルールを理解していれば、二値化は簡単に実現できます。

私たちが見つけた120、80、125などのしきい値は、実際のRGBとは異なる場合があります。そのため、検証コード上の固定位置に表示される数字には、2値化後に一部の場所に1が表示されることがあります。意味深すぎる干渉。ただし、認証コードの位置が不確かな写真の場合、文字をカットするときに干渉が発生する可能性があります。そのため、二値化後にノイズ除去が必要となります。

2: 次に、音を立てる 2 番目のステップに進みます。乾燥の原理は非常に単純で、ノイズが比較的高く、必要な効率が比較的高い場合には、やるべきことがまだたくさんあります。幸いなことに、ここではそれほど深さは必要ありません。点が 1 の場合、その点の 8 方向の数が 1 であるかどうかを判断します。1 でない場合は、それが 1 であるかどうかを判断します。ドライポイントとみなされますので、1 に設定してください。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478321.html技術記事前回の記事 PHP は検証コードの識別を実装します (主要記事) http://www.2cto.com/kf/201203/123439.html で、簡単な検証コードを識別する方法について説明しました。数字...

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート