Эта тема на forum.dklab.ru


Vladimir Sergeev: Генератор картинок со случайным числом
В целях повышения опыта и изучения возможностей gd и бал написан сабж.
Пришлось провести маленькое исследование соотношения читабельности к сложности расшифровки
таких картинок на нескольких популярных сайтах. В одних, например chat.ru OCR-ивание
не составит особого труда, в других, типа www.e-gold.com, цифры иногда не может распознать и
сам пользователь. Самой лучшей системой имхо оказалась система регистрации на ramblere,
http://mail.rambler.ru/new_user.html, по её образу и подобию я и написал сабж.

Скрипт выводит заданное число цифр в изображении заданных размеров.
Случайные параметры:
1. Размер цифры
2. Местоположение цифры (порядок цифр сохраняется)
3. TTF-шрифт, которым напечатана цифра, случайный из заданного списка
4. Угол наклона цифры относительно горизонтали
5. Зашумленность точками и линиями

Все настройки можно изменять, смотрите в исходниках, отмечу что
для того чтобы убрать зашумление линиями и/или точками нужно установить соответствующие
параметры в ноль. Не думаю, что следует устанавливать процент зашумленности более 10,
читабельность от этого очень страдает, то же самое и с максимальным числом зашумляющих линий.

Для работы скрипта нужно скопировать несколько(или один) TTF-шрифтов
(копируются из "C:\Windows\Fonts")в папку со скриптом, изменив соответствующие записи в скрипте.

Само число, показанное на картинке заносится в переменную $number.

Несмотря на достаточно частные вызовы rand() генерация картинки с дефолтными
настройками занимает 0,01 секунды, что вроде как неплохо. Работающий вариант
можно увидеть здесь: http://www.chdez.com.ru/bred

Вообщем на этом все, жду советов, замечаний по коду, багам.
Дмитрий Котеров:

Для работы скрипта нужно скопировать несколько(или один) TTF-шрифтов
(копируются из "C:\Windows\Fonts")в папку со скриптом, изменив соответствующие записи в скрипте.

Сразу к Вам рацпредложение: раз все равно скрипт ищет шрифты в своей папке, зачем этот список? Пусть он его самостоятельно строит, пройдясь по директории и найдя все TTF-файлы. Можно и вообще его разом получить: glob(dirname(__FILE__)."/*.ttf").
Vladimir Sergeev:
glob(dirname(__FILE__)."/*.ttf")
хм..круто!:)

Насчет автонахождения шрифтов у меня была идея, однако
я подумал, что это будет излишней громоздкостью (прочитать папку, выцепить *.ttf и т.д.)
и не решился запихивать сюда лишний десяток строк:)
К своему стыду, про функцию glob() я первый раз слышу.
Все оказалось проще, чем я думал, спасибо.

Теперь скрипт ищет шрифты в папке fonts.
"Пропатченный" скрипт в аттаче.
Константин Жинько [tIT]:

Работающий вариант
можно увидеть здесь: http://www.chdez.com.ru/bred

Хорошая картинка... Вообще ничего видно.
Vladimir Sergeev:
Хорошая картинка... Вообще ничего видно.
Извиняюсь, когда заливал последнюю версию, видимо файл побился,
по крайней мере его размер равнялся нулю.
Теперь все работает.

Кстати, я тут исправил маленький баг и добавил запрет на кэширование,
как в книге Дмитрия, по идее должно пригодиться.
Константин Жинько [tIT]:
Блин, прикольно =)
+1
Vladimir Sergeev:
Ок, спасибо.:)

Товарищ Yurik с phpclub'a предложил тестить подобные скрипты обычным
ABBYY ФайнРидером, как одним из лучших OCR'ов. Не знаю, может у
ФайнРидера специализация пошире чем в данном случае, но он не справляется
даже с чуть-чуть зашумленными картинками.

Попробовал обработать несколько картинок, с шумовыми точками, линиями и просто с цифрами.
Простые цифры без шума распознавались, и то, правда, если выделить блок и указать ридеру,
что в этом блоке только текст. Когда добавил незначительный процент шума
(2 процента, задается в настройках) ридер уже начал путать одно с другим,
распознавание не удалось. Добавление шумовых линий имеет не меньший эффект, ридер глохнет.:)

Результат, если честно, меня удивил, не думал, что шум из точек может
так запутать рапознаватель, не говоря уже и о линиях.
(Хотя вообще-то алгоритм избавления от такого шума не сложен, но все же это
дополнительные проблемы флудеру/спамеру)

Так что, если кто будет настраивать свое собственное соотношение читабельности к
сложности взлома, возьмите на заметку. Кстати, читабельность тоже легко проверить:
попробуйте быстро, за секунду, прочитать изображенное число, если удалось,
значит читабельность нормальная. Тест конечно не ахти какой, но лично меня например бесит
форма логина на e-gold.com, там в эту картинку надо несколько секунд вглядываться, чтоб хоть
что-то понять.

P.S. Залил архив на сервер приятеля, теперь скачать можно и здесь:
www.chdez.com.ru/bred/image.zip
Silent:
Несколько примитивнейших фильтров и брюки превращаются... превращаются брюки...

http://risearch.org/img/gd_test/gd_filter_test.html

На нескольких картинках шум все же остался, там примитивными фильтрами уже не обойдешься. Придется хорошенько подумать, минут 15, или даже 30.
А текущий алгоритм я придумал быстрее, чем написал код. Работает все с использованием того же GD, только на Перле.

Вывод - такой простой шум нет никакого смысла делать, нужно что-то более извращенное. На форуме ПХПклуба я предлагал простой алгоритм
деформации изображения, результат выглядит примерно так:

http://risearch.org/test_gd_distort.png

Это будет немного сложнее распознать, особенное если еще и шум добавить и цифры в разные стороны повернуть.
Ant:
Silent
Правила этого форума читали?

Перенесено из форума: Склад готовых решений :: PHP.
Перенесено в форум: Разное :: PHP.
Silent:
To Ant: читал. И что? Какой именно пункт правил я нарушил?
Duchal Alexander:
Silent
Обсуждение решений в данном форуме не приветствуется — если только это не обсуждение багов. В случае, если все же возникает желание завести обсуждение, лучше делать это в общем форуме по PHP.
Silent:
Гм... В общих правилах форума ничего не написано про то, что каждый подфорум может иметь свои собственные правила.

И если уж обсуждать в том форуме ничего нельзя, тогда лучше вообще запретить выкладывать там сырые решения без предварительного обсуждения в общем форуме. А создавать новые топики, когда на самом деле я хотел обсудить уже существующий, я никогда не буду.

P.S. Почему же модератор не открыл новый топик для обсуждения, а перенес весь топик? Наверное потому, что так оно логичнее - обсуждать в уже существующем топике.
P.P.S. Наверное лучше удалить весь этот мусор.
Vladimir Sergeev:

Несколько примитивнейших фильтров и брюки превращаются... превращаются брюки...

http://risearch.org/img/gd_test/gd_filter_test.html

На нескольких картинках шум все же остался, там примитивными фильтрами уже не обойдешься. Придется хорошенько подумать, минут 15, или даже 30.

пардон, это и ежу понятно. Никто не делает упор на какой-то один параметр,
как например точечный шум, для каждого из них можно написать свой алгоритм-отмычку.
Вся фишка в сочетании многих случайных параметров, пусть даже одни менее значимы,
чем другие.

Ну чтож, во флейм, так во флейм...
Раз уж на то пошло, Ваш алгоритм судя по всему несложно обойти.
Я не нашел в нем ни одного случайного параметра при искажении цифры, а это
значит, что можно просто для каждой цифры подсчитать число темных пикселов
и потом, получив случайную картинку разбивать её на отдельные цифры, считать и сравнивать,
в итоге определяя где какая цифра. Даже если Вы добавите шум и случайный угол наклона,
принцип распознования останется неизменным.
Duchal Alexander:
Предлагаю разделить тему - сам генератор - в готовые, а обсуждение оставить здесь.
Vladimir Sergeev:
Поддерживаю Duchal Alexander.
Ant:
Я предлагаю пока продолжить обсуждение здесь. Когда оно закончится и само решение будет готово окончательно — создать тему в готовых решениях, где приаттачить это самое готовое решение и ссылку на эту тему. А пока эта тема никак не тянет на «готовое решение» — кому захочется читать весь этот мусор? Пользователю главное — быстро найти и скачать что-то, чем читать целую эпопею.

В общих правилах форума ничего не написано про то, что каждый подфорум может иметь свои собственные правила.
Кстати да. Надо это будет указать в Правилах.

Silent:
Никто не делает упор на какой-то один параметр
И тем не менее скрипт был выложен в готовых решениях, что, как оказалось, на этом форуме означает, что обсуждению он уже не подлежит:)

Я не нашел в нем ни одного случайного параметра при искажении цифры
Хотел бы заметить, что я подал это только как идею, а не как готовый скрипт. Никто не мешает изменять параметры деформации случайным образом в определенных пределах (нужно еще найти эти пределы, чтобы цифры оставались легко читаемые человеком). Также можно брать разные шрифты (в том примере я использовал стандарный фонт из GD, но можно ведь и TTF использовать, да еще и разного размера). А если еще добавить поворот на случайный угол, то подсчет темных пикселей абсолютно ничего не даст. Ну и не стоит забывать про фон, его тоже нельзя оставлять белым.
Дмитрий Котеров:

Короче говоря. Bred Vilchec, как только у Вас будет окончательная версия, и Вы ей попользуетесь на практике достаточно, чтобы увериться: багов не видно, выкладывайте в Готовые решения (вместе с дистрибутивом!) и со ссылкой на данный топик.
dayw: header
Как вывести сгенирированную картинку в браузер после того как у меня уже были выводы текста, ведь header работает только до print'ов??? ПОМОГИТЕ
Vladimir Sergeev:
Никак не вывести. Картинка вставляется на страницу посредством <img src="_имя_скрипта.php_" />.
А вот насчет header работает только до print'ов
поясните, скорее всего Вы не правы.
dayw: Спасибо!
Я уже разобрался извините, что побеспокоил
scalpel:
Предлагаю перед вызовом imagetfttext добавить строку и убрать соответствующую строку вверху, выглядит красиво, прямо совсем как на Рамблере :)

$maxc = 200;
$text_color = imagecolorallocate($im, rand(0,$maxc), rand(0,$maxc), rand(0,$maxc));
Antonioli: Спасибо!
Большое спасибо за скрипт. Заменил imagetfttext на imagestring, потому что imagetfttext не поддерживался на сервере.

Привет из Первой столицы Украины! Respect!
Вячеслав:
Коллеги, у меня скрипт выполяется, показывает точки, иногда линии, но не показывает числа! В чем может быть проблемма? Переменная инициируется прямо в скрипте:

$number='102';

Эта тема на forum.dklab.ru