まず最初に、検証コード認識に関するいくつかの記事をお勧めします。良いと思います
PHP は検証コード認識 (プライマリ) を実装します
bpニューラルグリッド認識検証コードについて
1. アイデア
確認コードを見つけた場合、それを特定したい場合はどうすればよいですか?
まずいくつかの確認コードを観察してみましょう....
人間の目で観察すると、認証コードに含まれる文字がはっきりと認識されます。 では、人間の目の「認識メカニズム」とは何でしょうか?
それはおそらく認証コードの画像の文字の背景の色の違いです。文字と背景に色の違いがない場合、明らかに認証コードを判断できませんか?
だから、まずは人から始めましょう。
画像の色、つまり画像のRGB情報から始めます。
リーリーRGB情報を取得する関数を定義
リーリー
2番目、二値化
人間の目は検証コードを識別することができるため、検証コードのRGB情報には特定の特徴があるため、それを観察する必要があります。RGB配列を直接印刷して観察することは困難です。たくさん
PHPにおける検証コードの認識(一次記事)については、作者の判断によるものです
リーリーまずグレースケールを取得してから判断します
リーリー
その後、グレースケール情報に基づいて画像を印刷します
グレースケール情報を印刷しないように注意してください。 リーリー
$grayArray[$i][$j] < 80 から明らかな出力があることに注意してください。適切なしきい値を観察して選択し、配列 0101 を取得しました。画像を文字 ( 1) と背景 ( 0)、つまり二値化です。
リーリー
3. ノイズ除去
しかし、私たちの判断に影響を与える小さな点がいくつか見つかりました
私たちはこれらの干渉ノイズ点に気づくことができますが、私たちが機械である場合、これらの点が文字であるかどうかをどのように判断するのでしょうか?
それでは次に、これらの文字を削除する必要があります。
黒い点の上下左右8点がすべて白い場合はノイズ点と判断し、除去して白とします
リーリー
ノイズが消えていることがわかりました。
4.部門
現時点では、単一の数字と文字を操作する必要があります。まず数字を抽出します。
いくつかの認証コードの文字がつながっており、これが特に難しいです!!!
左から右、右から左、上から下、下から上にスキャンし、白い斑点を除去し、境界線を見つけます。
リーリー
次に、左から右にスキャンして文字の分割を見つけます
各次元が文字である 3 次元配列を返します。
リーリー
5. 傾き調整
3番目の9が少し傾いていることがわかりました
傾いた画像を「修正」する必要があります
人はどうやって対処するのでしょうか? まず、「どれくらい傾いているか」を目で観察し、次にどれだけ画像をねじって観察→ネガティブフィードバック→脳がねじれの角度を常に伝達し、最終的に写真は「正しい」ものになります。
人はどのようにして「傾き」を観察するのでしょうか? 上の「2」を例にとると、左上(右下)よりも右上(左下)の方が黒が多いかもしれません。
X 軸が下向き、Y 軸が右向きの直交座標系を確立します
各層の黒い点の分布の中点の座標を計算し、一連の離散点を取得し、これらの点が位置する直線を計算します (線形回帰式の計算)。式 y = b* x+a、
私はある日実際にこの公式を使用しました! ! !
それはおそらく傾いた直線であり、直線を通る直線の傾き角度を計算し、それを多くの角度で回転させると、画像は「右」になるはずです。
aとbの計算は以下の通りです
リーリー
角を曲がる方法は?
リーリー リーリーこれは三角関数です。私は長い間三角関数に触れていなかったので、ほとんど忘れていました。
関数を定義する
リーリー
角を曲がってください
リーリー
もう少し正しく見ると
6. ユニフォームのサイズ
上文中因为各种操作,每个字符大小不一,我们需要统一大小
七、特征值的建立
有很多方法
1、逐像素特征提取法
这是一种最简单的特征提取方法。它可以对图像进行逐行逐列的扫描,当遇到黑色像素时取其特征值为1,遇到白色像素时取其特征值为0,这样当扫描结束后就获得一个维数与图像中的像素点的个数相同的特征向量矩阵。
这种方法提取的信息量最大,但是它的缺点也很明显,就是适应性不强。
2、骨架特征提取法
两幅图像由于它们的线条的粗细不同,使得两幅图像差别很大,但是将它们的线条进行细化后,统一到相同的宽度,如一个像素宽时,这是两幅图像的差距就不那么明显。利用图形的骨架作为特征来进行数码识别,就使得识别有了一定的适应性。一般使用细化的方法来提取骨架,细化的算法有很多,如Hilditch算法、Rosenfeld算法等。对经过细化的图像利用EveryPixel函数进行处理就可以得到细化后图像的特征向量矩阵。骨架特征提取的方法对于线条粗细不同的数码有一定的适应性,但是图像一旦出现偏移就难以识别。
3、微结构法
微结构法将图像分为几个小块,统计每个小块的像素分布。本文提取出汉字的39个特征,存储在数组f[0]~f[38]中。具体算法可分为四步:
步骤一:把字符平均分成9份,如图4.1所示,给每一份编号如图4.2,统计每一份内黑色像素的个数,存储在数字tz[0]~tz[9]中,统计在行方向和列方向上每一份内的黑色像素个数和与之相邻的一份内黑色像素个数的比值作为一个特征,例如:行方向上提取特征f[0]=tz[1]/ tz[0],f[1]=tz[2]/ tz[1],f[2]=tz[0]/ tz[2],…,f[8]=tz[6]/ tz[8];列方向上f[9]=tz[3]/ tz[0],f[10]=tz[6]/ tz[3],f[11]=tz[0]/ tz[6],…,f[17]=tz[2]/ tz[8],共18个特征。
步骤二:把字符横向分成三份,如图4.3所示,统计每一份内的黑色像素个数,每一份内的黑色像素个数与前一份内黑色像素个数的比值作为一个特征,f[18]=tz[10]/ tz[9],f[19]=tz[11]/ tz[10],f[20]=tz[9]/ tz[11];把字符纵向分成三份,如图4.4所示,统计每一份内的黑色像素个数,每一份内的黑色像素个数与前一份内黑色像素个数的比值作为一个特征,f[21]=tz[13]/ tz[12],f[22]=tz[14]/ tz[13],f[23]=tz[12]/ tz[14];共六个特征。
步骤三:如图4.5,在竖直方向上找出三列,统计在该列中跳变点的个数,即相邻点像素值从0变到255的次数,共三个特征,记为f[24],f[25],f[26];在水平方向上找出三行列,统计在该行中跳变点的个数,即相邻点象素值从0变到255的次数,共三个特征,记为f[27],f[28],f[29]。
图4.5
步骤四:把每一份内黑色象素的个数tz[0]~tz[9],作为9个特征,记为:f[30]~f[38]。
这样得到汉字的共39个特征,根据这些特征就可以区分每个车牌汉字,进行识别。
我们使用最简单的逐像素特征提取法。
多多增加数据库,识别率会增加的
八、识别验证码
对于一个新的验证码,进行上文操作,然后对比数据库就可以了
79088d9552662d452520f976c44b7062
试试:
Header("Content-type: image/gif");
/*
* 初期化
*/
$border = 0; //border 1 はい: 0 いいえ
$how = 4 ; //検証コードの数字
$w = $how*15; //画像の幅
$fontsize = 5; //フォントサイズ
$alpha = "abcdefghijkmnopqrstuvwxyz";コード内容 1: 文字
$number = "023456789" //検証コード内容 2: 数字
$randcode = ""; //検証コード文字列の初期化
srand((double)microtime()*1000000);乱数seed
$im = ImageCreate($w, $h); //検証用画像を作成
/*
* 基本フレームを描画
*/
$bgcolor = ImageColorAllocate($im, 255, 255, 255) ; //背景色を設定します
ImageFill($im, 0, 0, $bgcolor); //背景色を塗りつぶします
if($border)
{
$black = ImageColorAllocate($im, 0, 0, 0); / /枠線の色を設定します
ImageRectangle($im, 0, 0, $w-1, $h-1, $black);//枠線を描画します
}
/*
* ランダムな文字を少しずつ生成します
*/
for ($i=0; $i<$how; $i++)
{
$alpha_or_number = mt_rand(0, 1); //文字または数字
$str = $alpha_or_number ?
$that = mt_rand(0, strlen($str)-1); //どの文字を取るか
$code = substr($str, $that, 1) //どの文字を取るか
$j = !$ i ? 4 : $j+ 15; //文字の位置を描画
$color3 = ImageColorAllocate($im, mt_rand(0,100), mt_rand(0,100)); // 文字の色
, $j, 3 , $code, $color3); //文字を描画します
$randcode .= $code; //認証コード文字列を少しずつ追加します
}
/*
* 干渉を追加します
*/
; $i=0; $i<5; $i++)//背景干渉線を描画します
$color1 = ImageColorAllocate($im, mt_rand(0,255), mt_rand(0,255)); color
ImageArc($ im, mt_ra...残りのテキスト>>
原理は難しくなく、PHP を通じて画像を生成するだけです。 PHP の画像処理機能を使用して、この画像にいくつかの文字を書き込むだけで準備完了です。文字を書くときは、書いた文字を記録することに注意してください。この記録はセッションを通じて行われます。その後、検証中に $_SESSION 変数を直接呼び出すだけです。
具体的なコードは次のとおりです:
画像の表示と入力確認コードの検証に使用される 2 つのファイルがあります
yangzhengma.php
session_start();
if(!empty($_GET['sub '] )){
if($_SESSION['checks'] == $_GET['ma']){
echo "検証コードは正しいです
";
}else{
echo "検証コードが間違っています!
";
}
}
?>