PHP图像识别技术原理与实现

作者:ruesin 时间:2024-06-05 09:43:54 

其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不过图像识别技术有一部分的容错性,而我们平时的密码验证是要100%匹配。

前几天,有朋友谈到做游戏点击抽奖,识别图片中的文字,当时立马想到的就是js控制或者flash做遮罩层,感觉这种办法是最方便快捷效果好,而且节省服务器资源,但是那边提的要求竟然是通过php识别图像中的文字。

赶巧那两天的新闻有:1、马云人脸识别支付;2、12306使用新的验证码,说什么现在国内的抢票软件都不能用了,发布不到一天就被破解。然后又很凑巧的那天早上看了一篇Java的图像识别技术文章。于是就琢磨着看一下PHP的图像识别技术。

其实所谓的图像识别,已经不是什么新技术了,起码我找到的资料都是很早之前的了。只不过我一直没涉及到这方面的工作,就一直没看过。

先说下这次实验的需求:有一张图片,里面三个位置分别有三个数字,要求取出相应位置的数字的值。(眼尖的同学可能会看出下面的代码是我拿的别人的,没错,的确是我直接copy别人并删减的,毕竟我对这些也是浅尝辄止,最后会贴出原作者的初始代码)

PHP图像识别技术原理与实现


class gjPhone
{

protected $imgPath; // 图片路径
 protected $imgSize; // 图片大小
 protected $hecData; // 分离后数组
 protected $horData; // 横向整理的数据
 protected $verData; // 纵向整理的数据
 function __construct ($path)
 {
   $this->imgPath = $path;
 }

public function getHec ()
 {
   $size = getimagesize($this->imgPath);
   $res = imagecreatefrompng($this->imgPath);
   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'] < 125 || $rgbarray['green'] < 125 ||
            $rgbarray['blue'] < 125) {
         $data[$i][$j] = 1;
       } else {
         $data[$i][$j] = 0;
       }
     }
   }
   $this->imgSize = $size;
   $this->hecData = $data;
 }

public function magHorData ()
 {
   $data = $this->hecData;
   $size = $this->imgSize;
   $z = 0;
   for ($i = 0; $i < $size[1]; ++ $i) {
     if (in_array('1', $data[$i])) {
       $z ++;
       for ($j = 0; $j < $size[0]; ++ $j) {
         if ($data[$i][$j] == '1') {
           $newdata[$z][$j] = 1;
         } else {
           $newdata[$z][$j] = 0;
         }
       }
     }
   }
   return $this->horData = $newdata;
 }

public function showPhone ($ndatas)
 {
   error_reporting(0);
   $phone = null;
   $d = 0;
   foreach ($ndatas as $key => $val) {
     if (in_array(1, $val)) {
       foreach ($val as $k => $v) {
         $ndArr[$d] .= $v;
       }
     }
     if (! in_array(1, $val)) {
       $d ++;
     }
   }
   foreach ($ndArr as $key01 => $val01) {
     $phone .= $this->initData($val01);
   }
   return $phone;
 }

/**
  * 初始数据
  */
 public function initData ($numStr)
 {
   $result = null;
   $data = array(
       '1' => '00000000111000000000000001110000000001001000100000000010100011000000000011000110000000000110000100000000010110011000000',
       '5' => '00000000001000000000000000010000000000100100100000000000101001110000000000100000110000000011000000100000001101000010000',
       '10' => '00000011100011100000000011001100100100100010010001000110000100100010001100001001000100011000010010001001001001100010100'
   );
   foreach ($data as $key => $val) {
     similar_text($numStr, $val, $pre);
     if ($pre > 95) { // 相似度95%以上
       $result = $key;
       break;
     }
   }
   return $result;
 }
}

$imgurl = 'jd.png';
list ($width, $heght, $type, $attr) = getimagesize($imgurl);
$new_w = 17;
$new_h = 11;
$thisimage = imagecreatetruecolor($new_w, $new_h); // $new_w, $new_h 为裁剪后的图片宽高
$background = imagecolorallocate($thisimage, 255, 255, 255);
imagefilledrectangle($thisimage, 0, 0, $new_w, $new_h, $background);
$oldimg = imagecreatefrompng($imgurl); // 载入原始图片

// 首先定位要取图的位置(这里可以通过前端js或者其他手段定位,由于我这是测试,所以就ps定位并写死了)
$weizhi = array(
   '1' => 165,
   '5' => 308,
   '10' => 456
);

foreach ($weizhi as $wwzz) {
 $src_y = 108;
 imagecopy($thisimage, $oldimg, 0, 0, $wwzz, $src_y, $new_w, $new_h); // $src_y,$new_w为原图中裁剪区域的左上角坐标拷贝图像的一部分将src_im图像中坐标从src_x,src_y开始,宽度为src_w,高度为src_h的一部分拷贝到dst_im图像中坐标为dst_x和dst_y的位置上。
 $tem_png = 'tem_1.png';
 imagepng($thisimage, __DIR__ . '/' . $tem_png); // 通过定位从原图中copy出想要识别的位置并生成新的缓存图,用以后面的图像识别类使用。

$gjPhone = new gjPhone($tem_png); // 实例化类
 $gjPhone->getHec(); // 进行图像像素分离
 $horData = $gjPhone->magHorData(); // 将分离出是数据转成01表示的图像、这里可以根据自己喜好定
 $phone = $gjPhone->showPhone($horData); // 将转换好的01表示的数据与库中的数据进行匹配,匹配度95以上就算成功,库这里由于是做测试就直接写了数组
 echo '| ' . $phone . ' | ';
}

如此看来,其实12306验证码被破解也算是有情可原了,也没必要那么的口诛笔伐了罢。只要不断的抓验证码图片并转成自己程序可读的数据存入库里,然后验证的时候进行匹配就可以了。那么阿里的人脸识别支付原理也算是理解了,只不过他们做的可能会很精细。

前端时间有看到阿里云的一个验证码形式,刚开始感觉可能会好点,现在看来,只要有心,其实也是可以破解的啊。

PHP图像识别技术原理与实现

标签:php,图像,识别
0
投稿

猜你喜欢

  • Python命令启动Web服务器实例详解

    2022-10-09 11:53:42
  • 浅谈Python中带_的变量或函数命名

    2023-08-30 15:44:08
  • 一文了解MySQL事务隔离级别

    2024-01-24 11:23:02
  • asp如何让计数器只对新进用户计数?

    2010-05-13 16:36:00
  • 交互设计的方法

    2010-08-18 12:32:00
  • Python中面向对象你应该知道的一下知识

    2022-01-31 11:35:47
  • Python使用Asyncio实现检查网站状态

    2023-01-23 18:56:39
  • 谈谈如何手动释放Python的内存

    2023-09-22 13:03:57
  • Python Datetime模块和Calendar模块用法实例分析

    2022-08-05 10:23:46
  • Python+OpenCV图像处理——实现直线检测

    2021-05-15 20:13:29
  • Pytorch搭建简单的卷积神经网络(CNN)实现MNIST数据集分类任务

    2021-04-24 02:25:16
  • Vue组件的通信方式详解

    2024-04-26 17:39:23
  • CentOS下使用yum安装python-pip失败的完美解决方法

    2023-07-09 12:23:01
  • JS简单获取并修改input文本框内容的方法示例

    2024-05-10 14:07:59
  • Python 实现自动化Excel报表的步骤

    2022-12-01 10:49:29
  • 删除重复数据的算法

    2024-05-13 09:36:14
  • 在CentOS上MySQL数据库服务器配置方法

    2024-01-19 07:01:21
  • Flask 入门系列 Cookie与session的介绍

    2022-06-21 00:45:44
  • Golang 使用http Client下载文件的实现方法

    2023-07-21 07:32:23
  • 一个非常有代表性的javascript简易拖动类

    2009-05-25 12:44:00
  • asp之家 网络编程 m.aspxhome.com