加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2016-11-27 07:20:03 所属栏目:大数据 来源:站长网
导读:其实图像识别技术与我们平时做的密码验证之类的没有什么区别,都是事先把要校验的数据入库,然后使用时将录入(识别)的数据与库中的数据做对比,只不过图像识别技术有一部分的容错性,而我们平时的密码验证是要100%匹配。 前几天,有朋友谈到做游戏点击抽

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

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

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

好了,下面是原作代码。

/**
 * 电话号码识别.
 * @author by zsc for 2010.03.24
 */
class gjPhone
{

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

  /**
   * 颜色分离转换...
   *
   * @param unknown_type $path      
   * @return unknown
   */
  public function getHec ()
  {
    $size = getimagesize($this-gt;imgPath);
    $res = imagecreatefrompng($this-gt;imgPath);
    for ($i = 0; $i lt; $size[1]; ++ $i) {
      for ($j = 0; $j lt; $size[0]; ++ $j) {
        $rgb = imagecolorat($res, $j, $i);
        $rgbarray = imagecolorsforindex($res, $rgb);
        if ($rgbarray['red'] lt; 125 || $rgbarray['green'] lt; 125 ||
             $rgbarray['blue'] lt; 125) {
          $data[$i][$j] = 1;
        } else {
          $data[$i][$j] = 0;
        }
      }
    }
    $this-gt;imgSize = $size;
    $this-gt;hecData = $data;
  }

  /**
   * 颜色分离后的数据横向整理...
   *
   * @return unknown
   */
  public function magHorData ()
  {
    $data = $this-gt;hecData;
    $size = $this-gt;imgSize;
    $z = 0;
    for ($i = 0; $i lt; $size[1]; ++ $i) {
      if (in_array('1', $data[$i])) {
        $z ++;
        for ($j = 0; $j lt; $size[0]; ++ $j) {
          if ($data[$i][$j] == '1') {
            $newdata[$z][$j] = 1;
          } else {
            $newdata[$z][$j] = 0;
          }
        }
      }
    }
    return $this-gt;horData = $newdata;
  }

  /**
   * 整理纵向数据...
   *
   * @return unknown
   */
  public function magVerData ($newdata)
  {
    for ($i = 0; $i lt; 132; ++ $i) {
      for ($j = 1; $j lt; 13; ++ $j) {
        $ndata[$i][$j] = $newdata[$j][$i];
      }
    }
    
    $sum = count($ndata);
    $c = 0;
    for ($a = 0; $a lt; $sum; $a ++) {
      $value = $ndata[$a];
      if (in_array(1, $value)) {
        $ndatas[$c] = $value;
        $c ++;
      } elseif (is_array($ndatas)) {
        $b = $c - 1;
        if (in_array(1, $ndatas[$b])) {
          $ndatas[$c] = $value;
          $c ++;
        }
      }
    }
    
    return $this-gt;verData = $ndatas;
  }

  /**
   * 显示电话号码...
   *
   * @return unknown
   */
  public function showPhone ($ndatas)
  {
    $phone = null;
    $d = 0;
    foreach ($ndatas as $key =gt; $val) {
      if (in_array(1, $val)) {
        foreach ($val as $k =gt; $v) {
          $ndArr[$d] .= $v;
        }
      }
      if (! in_array(1, $val)) {
        $d ++;
      }
    }
    foreach ($ndArr as $key01 =gt; $val01) {
      $phone .= $this-gt;initData($val01);
    }
    return $phone;
  }

  /**
   * 分离显示...
   *
   * @param unknown_type $dataArr      
   */
  function drawWH ($dataArr)
  {
    if (is_array($dataArr)) {
      foreach ($dataArr as $key =gt; $val) {
        foreach ($val as $k =gt; $v) {
          if ($v == 0) {
            $c .= "lt;font color='#FFFFFF'gt;" . $v . "lt;/fontgt;";
          } else {
            $c .= $v;
          }
        }
        $c .= "lt;br/gt;";
      }
    }
    echo $c;
  }

  /**
   * 初始数据...
   *
   * @param unknown_type $numStr      
   * @return unknown
   */
  public function initData ($numStr)
  {
    $result = null;
    $data = array(
        0 =gt; '000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000',
        1 =gt; '011000000000011000000000111111111111111111111111',
        2 =gt; '001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001',
        3 =gt; '001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100',
        4 =gt; '000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100',
        5 =gt; '111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100',
        6 =gt; '000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100',
        7 =gt; '110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000',
        8 =gt; '000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110',
        9 =gt; '001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000'
    );
    foreach ($data as $key =gt; $val) {
      similar_text($numStr, $val, $pre);
      if ($pre gt; 95) { // 相似度95%以上
        $result = $key;
        break;
      }
    }
    return $result;
  }
}

$imgPath = "http://bj.ganji.com/tel/5463013757650d6c5e31093e563c51315b6c5c6c5237.png";
$gjPhone = new gjPhone($imgPath);
// 进行颜色分离
$gjPhone-gt;getHec();
// 画出横向数据
$horData = $gjPhone-gt;magHorData();
echo "===============横向数据==============lt;br/gt;lt;br/gt;lt;br/gt;";
$gjPhone-gt;drawWH($horData);
// 画出纵向数据
$verData = $gjPhone-gt;magVerData($horData);
echo "lt;br/gt;lt;br/gt;lt;br/gt;===============纵向数据==============lt; br/gt;lt;br/gt;lt;br/gt;";
$gjPhone-gt;drawWH($verData);

// 输出电话
$phone = $gjPhone-gt;showPhone($verData);
echo "lt;br/gt;lt;br/gt;lt;br/gt;===============电话==============lt;br /gt;lt;br/gt;lt;br/gt;" . $phone;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读