распознавание текста из картинки посредством PHP
ЭТО моя первая статья так, что не судите строго. Долго я думал, над тем как можно сделать программу для распознавания текста из картинки средством PHP, да и вообще в целом. Оказываеться это и не такая сложная задача как казалась. Для примера возьмем 10 картинок в формаие .PNG и размером 40*40pх и закинем их в папку num файлы будуть назваться 1.PNG 2.PNG И ТД а файл который будем проверять назовем t.PNG ПРИ ЧЕМ ЦИФРЫ НА КАРТИНКАХ ДОЛЖНЫ БЫТЬ БЕЛЫМ ЦВЕТОМ НА ЧЕРНОМ ФОНЕ! Работа построена на класах.
создадим класс допустим tochki_x_and_y
<?php
class tochki_x_and_y{
function x_tock($images){
$img = imagecreatefrompng($images);
$size=getimagesize($images);
$H= $size[0]; //x
$W= $size[1];//y
for($i=0;$i<$H;$i++){
for($d=0;$d<$W;$d++){
//запись в масив каждой точки ее значения
$ret[]=imagecolorat($img,$d,$i);
#запишем индекс с координатами х и у
$x_and_y[]=$d."-".$i;
}
}
//вывод всех цифр занятыми точками
foreach($ret as $k=>$v){
if($v!=0){
$ch[$k]=$v;
}
}
#найдем все х
//находим сколько значений в х и у в каждой точке
foreach($ch as $k=>$v){
//$v-номер из $x_and_y
$x_y=explode("-",$x_and_y[$k]);
$x_all[]=$x_y[0];
}
//создаем проценты
for($i=0;$i<$H;$i++){
$a_x=array_count_values($x_all);
if(isset($a_x[$i])){
$x_pers_test[]=$a_x[$i];
}else{
$x_pers_test[]=0;
}
///
}
return $x_pers_test;
}
?>
этим кодом мы обрабатываем картинку и записываем значения точек (белый цвет) по х, так же делаем и для оси у
<?php
function y_tock($images){
$img = imagecreatefrompng($images);
$size=getimagesize($images);
$H= $size[0]; //x
$W= $size[1];//y
for($i=0;$i<$H;$i++){
for($d=0;$d<$W;$d++){
//запись в масив каждой точки ее значения
$ret[]=imagecolorat($img,$d,$i);
#запишем индекс с координатами х и у
$x_and_y[]=$d."-".$i;
}
}
//вывод всех цифр занятыми точками
foreach($ret as $k=>$v){
if($v!=0){
$ch[$k]=$v;
}
}
#найдем все х
//находим сколько значений в х и у в каждой точке
foreach($ch as $k=>$v){
//$v-номер из $x_and_y
$x_y=explode("-",$x_and_y[$k]);
$y_all[]=$x_y[1];
}
//создаем проценты
for($i=0;$i<$W;$i++){
///
$a_y=array_count_values($y_all);
if(isset($a_y[$i])){
$y_pers_test[]=$a_y[$i];
}else{
$y_pers_test[]=0;
}
}
return $y_pers_test;
}//function y_tock
?>
теперь созданим функцию для создания многомерного массива у и х обработанных данных(эталоны, цифры , которые мы используем для сравнения
<?php
//создаем многомерный массив для х
function mnogomer_x($st,$end){
for($i=$st;$i<=$end;$i++){
$array_x[$i]=$this->x_tock('num/'.$i.'.png');
}
return $array_x;
}
//и у
function mnogomer_y($st,$end){
for($i=$st;$i<=$end;$i++){
$array_y[$i]=$this->y_tock('num/'.$i.'.png');
}
return $array_y;
}
?>
следующая функция определяет разницу между массивом точек(у,х) которую проверяем и эталонных картинок
<?php
//находим разницу оригиала с цифрами
function nah_vseh_raznitc($st,$end,$arrays,$arr_proverka){
for($k=$st;$k<=$end;$k++){
$xxx[$k]=0;
for($i=0;$i<count($arrays[$k]);$i++){
if($arrays[$k][$i]>$arr_proverka[$i]){
$xxx[$k]=$xxx[$k]+($arrays[$k][$i]-$arr_proverka[$i]);
}else{
$xxx[$k]=$xxx[$k]+($arr_proverka[$i]-$arrays[$k][$i]);
}
}
}
return $xxx;
}//function nah_vseh_raznitc()
?>
и финальная функция выводит результат. а результатом будет наименьшее число, то есть более похожее
<?php
function result($xxx,$yyy){
//найдем суму в массивах
foreach($xxx as $k=>$v){
$sum[$k]=$v+$yyy[$k];
}
////
$this->sum=$sum;
//найдем номер с наименьшим массивом
foreach($sum as $key=>$value){
if($value==min($sum)){
$ch=$key;
break;
}
}
return $ch;
}//function sum_x_and_y_arrays()
}//class tochki_x_and_y
?>
теперь я покажу как работать с классом
<?php
include"class.php";
//РИСУЕМ ГРАФИК ТОЧЕК ИСХОДЯ ИЗ РИСУНКА
$tochki_x_and_y= new tochki_x_and_y();
$ot=1;
$do=9;
#ЗАПИСЫВАЕМ КООРДИНЫТЫ ТОЧЕК ИЗОБРАЖЕНИЯ, КОТОРОЕ ТЕСТИРУЕМ
$po_x_t=$tochki_x_and_y->x_tock('num/t.png');
$po_y_t=$tochki_x_and_y->y_tock('num/t.png');
#ЗАПИСЫВАЕМ КООРЖИНАТЫ ВСЕХ ЗНАЧЕНИЙ, КОТОРЫЕ ЕСТЬ В БАЗЕ(ПРИМЕРЫ)
$array_x=$tochki_x_and_y->mnogomer_x($ot,$do);
$array_y=$tochki_x_and_y->mnogomer_y($ot,$do);
#НАХОДИМ РАЗНИЦУ ТЕСТОВЫХ ЗАМЕРЕНИЙ И КАЖДОЙ ИЗ БАЗЫ
$xxx=$tochki_x_and_y->nah_vseh_raznitc($ot,$do,$array_x,$po_x_t);
$yyy=$tochki_x_and_y->nah_vseh_raznitc($ot,$do,$array_y,$po_y_t);
#РЕЗУЛЬТАТОМ БУДЕТ НАИМЕНЬШЕЕ ЧИСЛО
$result=$tochki_x_and_y->result($xxx,$yyy);
echo $result;
///////////
//просмотр как скрипт считает.
echo"<br>";
print_r($tochki_x_and_y->sum);
echo"<br>";
print_r($xxx);
echo"<br>";
print_r($yyy);
?>
вот и все, ни чегоже сложного правда?)))
URL:
https://visavi.net/articles/243