Капча -убираем шум

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

Рекомендую:

23.10.2010 | последняя редакция: 28.01.2011 |
  1. Cherry
    13.3.2013 в 02:48

    Клево, случайно попался сайт, мне нравится 😀
    Очищение капчи — интересно. А как насчет ucoz, это реально сделать? Там «общность» 98%