Капча -убираем шум
govnoproger.ru > php >
Ради интереса начал пописывать распозновалку капчи. Для первого раза выбрал весьма средненькую картинку, удалось быстро удалить шум – о чем собственно и пишу.
Первыми стали вот такие капчи. Итак – убираем шум.
Открываем в фотошопе, сильно приближаем, выбираем пробирку и просто щупаем. Надо нащупать нечто общее, на чем можно заострить внимание (прогеры поймут о чем я).
После детального пробирканья я кое чо нашел, от этого можно оттолкнуться.

Я обратил внимание, на то, что цвета у шума на шкалах r g и b больше 100. Но на цифрах (тк они яркие) больше 100 почти нету!
Давайте исключим эти цвета и позырим чо будет.
Для наглядности сделал по 2 двойных цикла (пихайте всё в один -это я тут так пишу)
<?php $image=imagecreatefrompng("captcha.png"); list($width, $height) = getimagesize("captcha.png"); $arr=array(); //суём каждый пиксель в двумерный массив for ($j=0;$j<$height;$j++) { for ($i=0;$i<$width;$i++) { $color_index= imagecolorat($image, $i, $j); //тут берем индекс цвета. Индекс - это непонятный набор цифр. $color_tran = imagecolorsforindex($image, $color_index); //переводим индекс в человеческий ргб, функция вернет ассоциативный массив $r=$color_tran['red']; $g=$color_tran['green']; $b=$color_tran['blue']; if ( (($r<100)||($g<100)||($b<100)) ) //вот собственно условие о котором я говорил $arr[$j][$i]=$color_tran; else $arr[$j][$i]=array('red'=> 255,'green'=> 255,'blue'=> 255,'alpha'=>0); // иначе, можно например 0 - черный } } $imagenew=imagecreatetruecolor($width, $height); //если сделаете 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 } } header('Content-Type: image/png'); imagepng($imagenew); //ну и выводим соответственно нашу картинку ?>
Итак смотрим что у нас получилось:
Неплохо, но на первой картинке виден дефект. Снова садимся за пробирку и видим что у дефекта один из цветов больше 200.
Давайте отсеем его изменив условие вот на такое:
if ( (($r<90)||($g<100)||($b<100))&&($r&&$g&&$b<200)&&($r&&$g<170) &&($b<180))
Смотрим результат:
Класс да?
Скачать capt1.zip
Клево, случайно попался сайт, мне нравится 😀
Очищение капчи — интересно. А как насчет ucoz, это реально сделать? Там «общность» 98%
индивидуально вполне реально