1、場景
最近在學習圖片處理,就是特意把數字生成一個圖片,然后再用程序去識別圖片的數字。這就有了一下的學習過程。
2、原理分析
2.1 首先是將圖片像素化,二值化,然后和字模去對比(需要相對於配置字模)
||
\/
||
\/
2.2 然后再這每個數字分別取出來,與字模庫做比較,匹配成功即可獲取對應的值
3、源碼
3.1 經過我修改后的代碼
使用說明:通過傳入的圖片地址獲取圖片的數字,$imgPath為圖片路徑
執行步驟:先把圖片像素化,二值化,保存數組,先橫向,再縱向,只要因為縱向方便處理單獨數字,然后把縱向的數據跟字模庫進行匹配,當匹配率達到95%以上即認為識別成功。
1 //【獲取圖片數字】 2 //$imgPath:圖片路徑 3 private function getPhoneByImg($imgPath){ 4 5 $gjPhone = new GjPhone($imgPath); 6 // 進行顏色分離 7 $gjPhone->getHec(); 8 // 畫出橫向數據 9 $horData = $gjPhone->magHorData(); 10 //echo "===============橫向數據==============<br/><br/><br/>"; 11 //$gjPhone->drawWH($horData); 12 // 畫出縱向數據 13 $verData = $gjPhone->magVerData($horData); 14 //echo "<br/><br/><br/>===============縱向數據==============< br/><br/><br/>"; 15 //$gjPhone->drawWH($verData); 16 17 // 輸出電話 18 19 $phone = $gjPhone->showPhone($verData); 20 //echo "<br/><br/><br/>===============電話==============<br /><br/><br/>"; 21 //$this->show($phone); 22 23 return $phone; 24 25 }

1 <?php 2 namespace common\models; 3 4 /** 5 * 電話號碼識別. 6 * @author by zsc for 2010.03.24 7 */ 8 class GjPhone 9 { 10 11 protected $imgPath; // 圖片路徑 12 protected $imgSize; // 圖片大小 13 protected $hecData; // 分離后數組 14 protected $horData; // 橫向整理的數據 15 protected $verData; // 縱向整理的數據 16 function __construct ($path) 17 { 18 $this->imgPath = $path; 19 } 20 21 /** 22 * 顏色分離轉換... 23 * 24 * @param unknown_type $path 25 * @return unknown 26 */ 27 public function getHec () 28 { 29 $size = getimagesize($this->imgPath); 30 $res = imagecreatefrompng($this->imgPath); 31 for ($i = 0; $i < $size[1]; ++ $i) { 32 for ($j = 0; $j < $size[0]; ++ $j) { 33 $rgb = imagecolorat($res, $j, $i); 34 $rgbarray = imagecolorsforindex($res, $rgb); 35 if ($rgbarray['red'] < 125 || $rgbarray['green'] < 125 || 36 $rgbarray['blue'] < 125) { 37 $data[$i][$j] = 1; 38 } else { 39 $data[$i][$j] = 0; 40 } 41 } 42 } 43 $this->imgSize = $size; 44 $this->hecData = $data; 45 } 46 47 /** 48 * 顏色分離后的數據橫向整理... 49 * 50 * @return unknown 51 */ 52 public function magHorData () 53 { 54 $data = $this->hecData; 55 $size = $this->imgSize; 56 $z = 0; 57 for ($i = 0; $i < $size[1]; ++ $i) { 58 if (in_array('1', $data[$i])) { 59 $z ++; 60 for ($j = 0; $j < $size[0]; ++ $j) { 61 if ($data[$i][$j] == '1') { 62 $newdata[$z][$j] = 1; 63 } else { 64 $newdata[$z][$j] = 0; 65 } 66 } 67 } 68 } 69 return $this->horData = $newdata; 70 } 71 72 /** 73 * 整理縱向數據... 74 * 75 * @return unknown 76 */ 77 public function magVerData ($newdata) 78 { 79 $i_length = count($newdata[1]); 80 $j_length = count($newdata)+1; 81 for ($i = 0; $i < $i_length; ++ $i) { 82 for ($j = 1; $j < $j_length; ++ $j) { 83 $ndata[$i][$j] = $newdata[$j][$i]; 84 } 85 } 86 87 $ndatas= []; 88 $sum = count($ndata); 89 $c = 0; 90 for ($a = 0; $a < $sum; $a ++) { 91 $value = $ndata[$a]; 92 if (in_array(1, $value)) { 93 $ndatas[$c] = $value; 94 $c ++; 95 } elseif (is_array($ndatas)) { 96 $b = $c - 1; 97 if (isset($ndatas[$b]) && in_array(1, $ndatas[$b])) { 98 $ndatas[$c] = $value; 99 $c ++; 100 } 101 } 102 } 103 104 return $this->verData = $ndatas; 105 } 106 107 /** 108 * 顯示電話號碼... 109 * 110 * @return unknown 111 */ 112 public function showPhone ($ndatas) 113 { 114 $phone = ''; 115 $d = 0; 116 $ndArr = []; 117 $ndArr[0] = ''; 118 foreach ($ndatas as $key => $val) { 119 120 if (in_array(1, $val)) { 121 122 foreach ($val as $k => $v) { 123 $ndArr[$d] .= $v; 124 } 125 }else{ 126 $d ++; 127 $ndArr[$d] = ''; 128 } 129 130 } 131 array_pop($ndArr); 132 //return $ndArr; 133 134 135 foreach ($ndArr as $key01 => $val01) { 136 $phone .= $this->initData($val01); 137 } 138 return $phone; 139 } 140 141 /** 142 * 分離顯示... 143 * 144 * @param unknown_type $dataArr 145 */ 146 function drawWH ($dataArr) 147 { 148 $c = ''; 149 if (is_array($dataArr)) { 150 foreach ($dataArr as $key => $val) { 151 foreach ($val as $k => $v) { 152 if ($v == 0) { 153 $c .= "<font color='grend'>" . $v . "</font>"; 154 } else { 155 $c .= $v; 156 } 157 } 158 $c .= "<br/>"; 159 } 160 } 161 echo $c; 162 } 163 164 /** 165 * 初始數據... 166 * 167 * @param unknown_type $numStr 168 * @return unknown 169 */ 170 public function initData ($numStr) 171 { 172 //return 1; 173 $result = ''; 174 $data = array( 175 0 => '00011110000011111100011000011011000000111100000011011000011000111111000001111000', 176 1 => '001000000101100000011111111111111111111100000000010000000001', 177 2 => '00100000010110000011110000011110000011011000011001110011000101111000010011000001', 178 //3 => '001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100', 179 3=> '01000000101100000011100000000110001000011000100001110111001101110111100010001100', 180 //4 => '000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100', 181 4 => '00000110000000111000000110100000110010000110001000111111111111111111110000001000', 182 5 => '11111001001111100110100010001110010000011001000001100110001110001111100000011100', 183 6 => '00111111000111111110110001001110001000011000100001110011001101100111100000001100', 184 //7 => '110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000', 185 7 => '10000000111000000111100000110010000110001000110000100110000011110000001110000000', 186 //8 => '000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110', 187 8 => '00100011000111011110110111001110001000011000100001110111001101110111100010001100', 188 9 => '00110000000111100110110011001110000100011000010001110010001101111111100011111100', 189 190 '-' => '00000100000000010000000001000000000100000000010000000001000000000100000000010000' 191 ); 192 193 194 195 foreach ($data as $key => $val) { 196 similar_text($numStr, $val, $pre); 197 if ($pre > 95) { // 相似度95%以上 198 199 $result .= $key; 200 break; 201 } 202 } 203 return $result; 204 } 205 } 206
3.2 引用的源碼

1 /** 2 * 電話號碼識別. 3 * @author by zsc for 2010.03.24 4 */ 5 class gjPhone 6 { 7 8 protected $imgPath; // 圖片路徑 9 protected $imgSize; // 圖片大小 10 protected $hecData; // 分離后數組 11 protected $horData; // 橫向整理的數據 12 protected $verData; // 縱向整理的數據 13 function __construct ($path) 14 { 15 $this->imgPath = $path; 16 } 17 18 /** 19 * 顏色分離轉換... 20 * 21 * @param unknown_type $path 22 * @return unknown 23 */ 24 public function getHec () 25 { 26 $size = getimagesize($this->imgPath); 27 $res = imagecreatefrompng($this->imgPath); 28 for ($i = 0; $i < $size[1]; ++ $i) { 29 for ($j = 0; $j < $size[0]; ++ $j) { 30 $rgb = imagecolorat($res, $j, $i); 31 $rgbarray = imagecolorsforindex($res, $rgb); 32 if ($rgbarray['red'] < 125 || $rgbarray['green'] < 125 || 33 $rgbarray['blue'] < 125) { 34 $data[$i][$j] = 1; 35 } else { 36 $data[$i][$j] = 0; 37 } 38 } 39 } 40 $this->imgSize = $size; 41 $this->hecData = $data; 42 } 43 44 /** 45 * 顏色分離后的數據橫向整理... 46 * 47 * @return unknown 48 */ 49 public function magHorData () 50 { 51 $data = $this->hecData; 52 $size = $this->imgSize; 53 $z = 0; 54 for ($i = 0; $i < $size[1]; ++ $i) { 55 if (in_array('1', $data[$i])) { 56 $z ++; 57 for ($j = 0; $j < $size[0]; ++ $j) { 58 if ($data[$i][$j] == '1') { 59 $newdata[$z][$j] = 1; 60 } else { 61 $newdata[$z][$j] = 0; 62 } 63 } 64 } 65 } 66 return $this->horData = $newdata; 67 } 68 69 /** 70 * 整理縱向數據... 71 * 72 * @return unknown 73 */ 74 public function magVerData ($newdata) 75 { 76 for ($i = 0; $i < 132; ++ $i) { 77 for ($j = 1; $j < 13; ++ $j) { 78 $ndata[$i][$j] = $newdata[$j][$i]; 79 } 80 } 81 82 $sum = count($ndata); 83 $c = 0; 84 for ($a = 0; $a < $sum; $a ++) { 85 $value = $ndata[$a]; 86 if (in_array(1, $value)) { 87 $ndatas[$c] = $value; 88 $c ++; 89 } elseif (is_array($ndatas)) { 90 $b = $c - 1; 91 if (in_array(1, $ndatas[$b])) { 92 $ndatas[$c] = $value; 93 $c ++; 94 } 95 } 96 } 97 98 return $this->verData = $ndatas; 99 } 100 101 /** 102 * 顯示電話號碼... 103 * 104 * @return unknown 105 */ 106 public function showPhone ($ndatas) 107 { 108 $phone = null; 109 $d = 0; 110 foreach ($ndatas as $key => $val) { 111 if (in_array(1, $val)) { 112 foreach ($val as $k => $v) { 113 $ndArr[$d] .= $v; 114 } 115 } 116 if (! in_array(1, $val)) { 117 $d ++; 118 } 119 } 120 foreach ($ndArr as $key01 => $val01) { 121 $phone .= $this->initData($val01); 122 } 123 return $phone; 124 } 125 126 /** 127 * 分離顯示... 128 * 129 * @param unknown_type $dataArr 130 */ 131 function drawWH ($dataArr) 132 { 133 if (is_array($dataArr)) { 134 foreach ($dataArr as $key => $val) { 135 foreach ($val as $k => $v) { 136 if ($v == 0) { 137 $c .= "<font color='#FFFFFF'>" . $v . "</font>"; 138 } else { 139 $c .= $v; 140 } 141 } 142 $c .= "<br/>"; 143 } 144 } 145 echo $c; 146 } 147 148 /** 149 * 初始數據... 150 * 151 * @param unknown_type $numStr 152 * @return unknown 153 */ 154 public function initData ($numStr) 155 { 156 $result = null; 157 $data = array( 158 0 => '000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000', 159 1 => '011000000000011000000000111111111111111111111111', 160 2 => '001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001', 161 3 => '001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100', 162 4 => '000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100', 163 5 => '111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100', 164 6 => '000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100', 165 7 => '110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000', 166 8 => '000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110', 167 9 => '001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000' 168 ); 169 foreach ($data as $key => $val) { 170 similar_text($numStr, $val, $pre); 171 if ($pre > 95) { // 相似度95%以上 172 $result = $key; 173 break; 174 } 175 } 176 return $result; 177 } 178 } 179 180 $imgPath = "http://bj.ganji.com/tel/5463013757650d6c5e31093e563c51315b6c5c6c5237.png"; 181 $gjPhone = new gjPhone($imgPath); 182 // 進行顏色分離 183 $gjPhone->getHec(); 184 // 畫出橫向數據 185 $horData = $gjPhone->magHorData(); 186 echo "===============橫向數據==============<br/><br/><br/>"; 187 $gjPhone->drawWH($horData); 188 // 畫出縱向數據 189 $verData = $gjPhone->magVerData($horData); 190 echo "<br/><br/><br/>===============縱向數據==============< br/><br/><br/>"; 191 $gjPhone->drawWH($verData); 192 193 // 輸出電話 194 $phone = $gjPhone->showPhone($verData); 195 echo "<br/><br/><br/>===============電話==============<br /><br/><br/>" . $phone;
4、擴展說明
只要適當修改字模庫,便可識別字母,特殊字符等,按照縱向數據,修改字模庫即可。
5 查閱文章的地址
學習過程難免需要大量閱讀別人的文章和分析,本人初次接觸,收獲良多,感謝分享的人!
原文地址1:http://www.jb51.net/article/95854.htm
原文地址2:http://www.jb51.net/article/78645.htm