php实现验证码识别的方法:首先将图片二值化,并将值保存到二维数组里;然后通过循环,求出每一个数字的位置;接着计算出数字在二维数组里的位置,并拼接数字;最后将字符串与每一个字模的字符串进行比较识别即可。
推荐:《PHP视频教程》
但是原文的介绍比较简单,而且没提到算法的具体实现过程。详细过程转自:
第一部分:验证码的识别
可以看出,这是第一种验证码,为了让人眼能够识别出数字,所以验证码图片的数字颜色和背景颜色的色差是比较大的,所以其RBG值也相差很大,可以通过判断每个像素的RGB值来区分数字和背景。
可以发现,每个数字的宽是6px,高是10px,数字的间隔是4px,第一个数字左边偏移了2px,顶部偏移了0px。这些数字后面都是要用到的。
可以得出一个结论:背景颜色的R、G、B值都是大于200的,而数字的颜色的R、G、B值的某一项有可能小于200,因此可以很容易区分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
echo '<br><img src="v1.jpg"><br><br>';
getHec("v1.jpg");
function getHec($imagePath) { $res = imagecreatefromjpeg($imagePath); $size = getimagesize($imagePath);
for ($i = 0; $i < $size[1]; ++$i) { for ($j = 0; $j < $size[0]; ++$j) { $rgb = imagecolorat($res, $j, $i); $rgbarray = imagecolorsforindex($res, $rgb); if ($rgbarray['red'] < 200 || $rgbarray['green']<200 || $rgbarray['blue'] < 200) { echo "0"; }else{ echo "-"; } } echo "<br>"; } } |
如果图片的背景颜色比较复杂,处理方法也是一样的,总能找到临界值来区分,具体要靠自己观察了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
for($i=0;$i<10;$i++){ echo"'$i'=>'"; echogetHec("$i.jpg")."',<br>"; }
functiongetHec($imagePath){ $res=imagecreatefromjpeg($imagePath); $size=getimagesize($imagePath);
for($i=0;$i<$size[1];++$i){ for($j=0;$j<$size[0];++$j){ $rgb=imagecolorat($res,$j,$i); $rgbarray=imagecolorsforindex($res,$rgb); if($rgbarray['red']<200||$rgbarray['green']<200||$rgbarray['blue']<200){ echo"1"; }else{ echo"0"; } } } } |
1 2 3 4 5 6 7 8 9 10 |
'0'=>'011110100001100001100001100001100001100001100001100001011110', '1'=>'001000111000001000001000001000001000001000001000001000111110', '2'=>'011110100001100001000001000010000100001000010000110011111111', '3'=>'011110100001100001000010001100000010000001100001100001011110', '4'=>'000100000100001100010100100100100100111111000100001100001111', '5'=>'111111100000100000101110110001000001000001100001100001011110', '6'=>'001110010001100000100000101110110001100001100001100001011110', '7'=>'111111100010100010000100000100001000001000001000001000001000', '8'=>'011110100001100001100001011110010010100001100001100001011110', '9'=>'011100100010100001100001100011011101000001000001100010011100', |