Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2012, 22:01   #1
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Восклицание очистить изображение от шума. что в скрипте не так?

Доброего времени суток форумчани.
Вот пишу скрипт для распознавания капчи, оно то распознаёнт но с трудом.
Вот интересуюсь как нормально очистить картинку от шума.

Пример капчи:


после очистки от шума:


На этом этапе оно уже распознаёт все символы капчи SUYC
Но на всякий случай заганяю его еще в ЧБ, оно еще подчищает картинку.


Для распознания использую GOCR.
Вот исходнии:
PHP код:
<?php
require_once('PixelOpeation.php');

function 
Gocr($file){
    
//чистим от шума
    
$file AntiNoice($file);

   
//Заганяем в чб
    
$po = new Image_PixelOperations;
    
$po->pixelOperation($file$file, array($po'blackAndWhite'), 100);

    
//Распозаём
    
$handle popen('gocr -C "A-Z" '.$file.' 2>&1''r');
    
$read fread($handle2096);
    
    
//Убираем пробелы, подчеркивания и скобки
    
$healthy = array("_"," ","+","(",")");
    
$yummy   = array("","","","","");
    
$text str_replace($healthy$yummy$read);
    
    return 
$text;
}
Вот скрипт очистки:
PHP код:
<?php
ini_set
('max_execution_time',0); 
    
function 
AntiNoice($file$clearfon=null){
    
$filePath DOCUMENT_ROOT."/".$file;

$image=imagecreatefrompng($filePath);


list(
$width$height) = getimagesize($filePath);
$arr=array();
//суём каждый пиксель в двумерный массив
for ($j=0;$j<$height;$j++)
{
    for (
$i=0;$i<$width;$i++)
    {
        
$color_indeximagecolorat($image$i$j);
        
//тут берем индекс цвета. Индекс - это непонятный набор цифр.
        
$color_tran imagecolorsforindex($image$color_index);
        
//переводим индекс в человеческий ргб, функция вернет ассоциативный массив
        
$r=$color_tran['red'];
        
$g=$color_tran['green'];
        
$b=$color_tran['blue'];
        
            
//if((($r<150)||($g<150)||($b<150)))
            
if((($r<=62)||($g<100)||($b<140)))
            
//вот собственно условие о котором я говорил
            
$arr[$j][$i]=$color_tran;
            else 
$arr[$j][$i]=array('red'=> 255,'green'=> 255,'blue'=> 255,'alpha'=>0);
            
// иначе, можно например 0 - черный
        
    
}
}
$imagenew=imagecreatetruecolor($width$height);

imageantialias($imagenewtrue);
//если сделаете imagecreate то работать небудет
//далее двойной цикл - рисуем картинку, ещё раз для идиотов - делать нужно одним двойным циклом
for ($j=0;$j<$height;$j++)
{
    for (
$i=0;$i<$width;$i++)
    {
        
$r=$arr[$j][$i]["red"];
        
$g=$arr[$j][$i]["green"];
        
$b=$arr[$j][$i]["blue"];
        
$col=imagecolorexact ($image $r $g $b );
//делаем тоже самое что и в том цикле, только наоборот - переводим в индекс шкалу ргб
        
imagesetpixel $imagenew $i $j $col );
//выводим пиксель с индексом цвета $col
    
}
}

$out_file $file;
if(empty(
$clearfon)){
    
$out_file explode('.'$file);
    
$out_file DOCUMENT_ROOT."/tmp/".$out_file[0]."_out.png";
}

imagepng($imagenew$out_file);
imagedestroy($imagenew);
    
return 
$out_file;
}
?>
Нарыл его на просторах инетрнета и немножко подкоректировал. При текущем условии эту капчу расознаёт идеально.
Изображения
Тип файла: png 1333719704.png (13.4 Кб, 77 просмотров)
Тип файла: png 1333719704_out.png (805 байт, 78 просмотров)
Тип файла: png 1333719704_noise.png (2.5 Кб, 73 просмотров)
dem66 вне форума Ответить с цитированием
Старый 07.04.2012, 22:01   #2
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

А вот этим заганяю в ЧБ, тоже из простор инетрнета.
PHP код:
<?php
class Image_PixelOperations 
         
    function 
pixelOperation
            
$input_image
            
$output_image
            
$operation_callback
            
$factor false 
            

    { 
         
        
$image imagecreatefrompng($input_image); 
        
$x_dimension imagesx($image); 
        
$y_dimension imagesy($image); 
        
$new_image imagecreatetruecolor($x_dimension$y_dimension); 
         
        if (
$operation_callback == 'contrast') { 
            
$average_luminance $this->getAverageLuminance($image); 
        } else { 
            
$average_luminance false
        } 
         
        for (
$x 0$x $x_dimension$x++) { 
            for (
$y 0$y $y_dimension$y++) { 
         
                
$rgb imagecolorat($image$x$y); 
                
$r = ($rgb >> 16) & 0xFF
                
$g = ($rgb >> 8) & 0xFF
                
$b $rgb 0xFF
         
                
$pixel = new Pixel($r$g$b); 
                
$pixel call_user_func
                    
$operation_callback
                    
$pixel
                    
$factor
                    
$average_luminance 
                
); 
         
                
$color imagecolorallocate
                    
$image
                    
$pixel->r
                    
$pixel->g
                    
$pixel->
                
); 
                
imagesetpixel($new_image$x$y$color); 
            } 
         
        } 
         
        
imagepng($new_image$output_image); 
    } 
    
  
    function 
blackAndWhite($pixel$factor
    { 
        
$pixel_total = ($pixel->$pixel->$pixel->b); 

        if (
$pixel_total > (((255 $factor) / 2) * 3)) { 
            
// белый 
            
$pixel->255
            
$pixel->255
            
$pixel->255
        } else { 
            
$pixel->0
            
$pixel->0
            
$pixel->0
        } 

        return 
$pixel
    }
    
}
class 
Pixel 
    function 
Pixel($r$g$b
    { 
        
$this->= ($r 255) ? 255 : (($r 0) ? : (int)($r)); 
        
$this->= ($g 255) ? 255 : (($g 0) ? : (int)($g)); 
        
$this->= ($b 255) ? 255 : (($b 0) ? : (int)($b)); 
    } 
}
Так вот интересует как все это зделать по культурнее, поуниверсальнеё чтоли. Ато оно сейчас распозаёт тольо этот тип апчи, а вот если ссади появлются линии (хотя их почти все убирает преобразование в ЧБ, даже без предварительной очистки) то начинаются проблемы.

Подскажите как чистить изображения?
dem66 вне форума Ответить с цитированием
Старый 07.04.2012, 22:15   #3
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Вот еще примеры:
сдесь оно понимает только HC, хотя ризображение реально чище предыдущего, непонимает видать повернутые буквы


Выход:
Изображения
Тип файла: png 1333731537.png (5.9 Кб, 74 просмотров)
Тип файла: png 1333731537_out.png (517 байт, 72 просмотров)
dem66 вне форума Ответить с цитированием
Старый 08.04.2012, 13:07   #4
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

это что такая сложная тема что нито ниче сазать не может а?
dem66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что-то не так в программе...не пойму что Karina_Vamp Помощь студентам 5 24.12.2010 21:06
Как сделать так чтобы изображение было поверх таблицы otenova HTML и CSS 2 29.09.2010 18:00
Скрипт не работает должным образом! Подскажите, что в скрипте не верно? Qwertys777 PHP 10 02.12.2009 09:40
подскажите пожалуйста что не правильно в скрипте. 6AT9 JavaScript, Ajax 1 25.11.2008 00:21