Алгоритм Swirl (похож на Twirl из Photoshop) пакета ImageMagick производит закручивание изображение вокруг центра на некоторый угол:
Swirl на 100°
Видно, что достигается достаточно сильное искажение первоначального рисунка, с сохранением, однако, читабельности. Правда, преобразование Swirl обратимо. Это значит, что, если мы над искаженным изображением проведем обратную операцию (в данном случае повернем на -100°), получится исходная, неискаженная картинка.
Swirl обратно (на -100°)
Если мы просто повернем изображение вокруг центра на какой-то произвольный угол, то взломщику достаточно подобрать этот угол (а его необязательно подбирать с точностью до градуса, небольшие отклонения приведут к небольшим, несущественным для распознавания искажениям).
Поэтому очевидно, что защиту надо усложнить. А именно производить несколько поворотов вокруг произвольно выбранных центров на произвольные углы.
Практика показывает, что достаточно двух искажений, чтобы значительно запутать возможного взломщика. Эти два поворота лучше делать в противоположных направлениях, чтобы не слишком "закручивать" результат в ущерб читаемости человеком.
Вот отлаженный код для ImageMagick (Для понятности код разделен на строки и снабжен комментариями. Реальная консольная команда должна быть написана без комментариев и в одну строку)
convert -size 300x100 xc:white # поле 300x100, белого цвета,
-type TrueColor -antialias -fill black # печатаем черным с антиалиасингом...
-font times.ttf -pointsize 70 -draw 'text 20,70 "STRING"' # строку STRING шрифтом times.ttf 70-ым
-extent 400x120 -roll +101+4 # подвинуть центр влево на 100 точек +случайная флуктуация
-swirl 40 # первый swirl на случайный угол (от 37 до 51)
-extent 600x140 -roll +3-4 # подвинуть центр вправо на 200 точек, тоже со случайной флуктуацией
-swirl -30 # второй поворот (от 20 до 35)
-crop 300x100+100+17 +repage -resize 150x50 gif:- # окончательная обработка и вывод в stdout
Вот результат (нажмите кнопку "Обновить" рядом с картинкой для перегенерации):
В качестве путей для улучшения защиты стоит задуматься об уменьшении расстояния между символами, использовать широкий диапазон символов (а не только цифры), а также добавить такой шум, который бы затруднял роботу определение границ символов.