Смотри также: Разбор
Вступление
Вы работаете в правительственной команде по программированию, которая программирует камеры контроля скорости. Тем не менее, группа людей, которые запрограммировали калькулятор скорости, заняли слишком много места, поэтому вы должны сделать программное обеспечение для распознавания номерных знаков как можно меньше.
Вызов
Учитывая изображение номерного знака, верните текст на табличке.
Номерные знаки
Ниже приведены все символы, которые ваша программа должна распознавать:
АБВГДЕЖ
H1JKLMN0
PQRSTUVW
XYZ01234
56789
Заметка
На британских номерных знаках символы для I (i) и 1 (один) одинаковы, а символы для O (o) и 0 (ноль) одинаковы. По этой причине всегда предполагайте, что символы - это числа. Т.е. следующий номерной знак равен 10 (один ноль):
Примеры
C0D3 GLF
B3T4 DCY
M1NUS 15
YET1CGN
Другие правила
Доступ к Интернету и библиотеки OCR запрещены.
Таблички с номерами всегда будут выглядеть так, как показано выше. Все номерные знаки будут примерно одинакового размера (будут некоторые неточности из-за метода обрезки).
Если вам требуются версии PNG без каких-либо номерных знаков, я предоставлю их вам.
счет
Самая короткая программа в байтах побеждает.
Все номерные знаки являются скриншотами панели поиска на этом сайте.
источник
Ответы:
C, 409 байт (и я удивлен как никто)
Принимает в качестве входных данных: width (
w
) и height (h
) изображения, а затем упакованные RGB-данные в виде массиваchar
s (d
). Все остальные параметры функции являются скрытыми объявлениями переменных. Игнорирует все, кроме зеленого канала, и применяет порог 32 в качестве начального прохода.Почти так же, как метод @ DavidC, за исключением того, что проверяется, что заполнено не менее 35% каждого поля выборки. Надеюсь, это сделает масштабирование изменений более надежным, но кто знает.
Я использовал метод грубой силы, чтобы выяснить, какой размер повторной выборки и процент покрытия использовать для лучшей надежности (т.е. наименьшее количество случаев, когда один символ имеет несколько интерпретаций). Оказалось, что сетка 4x5 с охватом 35% была лучшей. Затем я использовал второй метод грубой силы для вычисления наилучшего расположения битов и значения по модулю, чтобы упаковать символьные данные в короткую строку - младший бит в верхнем левом углу, увеличивающийся по x, затем по y, с окончательным значением% 101, повернутым лучше всего, давая эту таблицу поиска:
Вычитание 7 означает, что начальные значения могут быть удалены, а последние 2 могут быть удалены без дополнительной работы. Это удаление означает, что некоторые неправильные входные данные могут вызвать недопустимое чтение из памяти, поэтому это может вызвать сбой на определенных изображениях.
Использование:
Чтобы получить изображения, я написал обертку, используя libpng. Также оказывается, что, несмотря на имя файла, изображения в вопросе на самом деле являются jpegs (!), Поэтому вам нужно будет сначала вручную экспортировать их как pngs.
Сломать
источник
Mathematica
1170 1270 1096 1059 650 528 570 551 525498 байтПоследняя версия экономит 27 байт, не требуя «обрезки» пластины перед ее анализом. Предпоследняя версия сэкономила 26 байт, используя только 10 из 24 исходных точек выборки.
122 байта были сохранены благодаря идее LegionMammal978, заключающейся в упаковке длинного списка из 10 основных чисел в одно целое число из 36 базовых чисел. Он срезал еще 20 байтов с окончательного кода.
Скачок с 528 до 570 байт был вызван дополнительным кодом для обеспечения того, чтобы порядок возвращаемых букв соответствовал порядку букв на номерном знаке. Центроид для каждой буквы содержит X-координату, которая показывает относительное положение букв вдоль X.
Код без правил
обзор
Основная идея состоит в том, чтобы проверить, соответствует ли систематическая выборка пикселей из входного изображения пикселям из того же места на достоверных изображениях. Большая часть кода состоит из битовых подписей для каждого символа,
На диаграмме показаны пиксели, которые взяты из букв «J», «P», «Q» и «R».
Значения пикселей могут быть представлены в виде матриц. Темные, жирные
1
соответствуют черным клеткам. Это0
соответствует белым клеткам.Это правила замены расшифровки для JPQ R.
{1, 1, 1, 1, 9, 15} -> «J»,
{15, 9, 15, 14, 8, 8} -> «P»,
{15, 9, 9, 9, 15, 15 } -> «Q»,
{15, 9, 15, 14, 10, 11} -> «R»
Должно быть возможно понять, почему правило для «0» таково:
{15, 9, 9, 9, 9, 15} -> "0"
и, следовательно, отличается от буквы «Q».
Ниже показаны 10 баллов, использованных в финальной версии. Этих точек достаточно для идентификации всех персонажей.
Что делают функции
plateCrop[img]
удаляет рамку и левый край с пластины, делает фон белым. Мне удалось исключить эту функцию из окончательной версии, выбрав компоненты изображения, возможные буквы размером от 100 до 120 пикселей.isolateLetters[img]
удаляет отдельные буквы из обрезанного изображения.Мы можем показать, как это работает, показывая, куда обрезанное изображение выводится в
plateCrop
качестве входных данныхisolateLetters
. Вывод представляет собой список отдельных символов.Coordinates
24 равномерно распределенных положения для проверки цвета пикселя. Координаты соответствуют указанным на первом рисунке.{{9, 99}, {27, 99}, {45, 99}, {63, 99}, {9, 81}, {27, 81}, {45, 81}, {63, 81}, { 9, 63}, {27, 63}, {45, 63}, {63, 63}, {9, 45}, {27, 45}, {45, 45}, {63, 45}, {9, 27}, {27, 27}, {45, 27}, {63, 27}, {9, 9}, {27, 9}, {45, 9}, {63, 9}}
h
преобразует пиксели в двоичный файлcodes
являются подписью для каждого символа. Десятичные значения - это сокращения двоичного кода для черных (0) и белых (1) ячеек. В версии для гольфа используется основание 36.(*
decryptRules
предназначены для замены подписи соответствующим символом *)f
это функция, которая берет изображение номерного знака и возвращает письмо.{"A", "B", "C", "D", "E", "F", "G"}
{"H", "1", "J", "K", "L", "M", "N", "0"}
{"P", "Q", "R", "S", "T", "U", "V", "W"}
{"X", "Y", "Z", "0", "1", "2", "3", "4"}
{"5", "6", "7", "8", "9"}
Golfed
Код сокращается за счет использования одного десятичного числа для представления всех 24 битов (белого или черного) для каждого символа. Например, буква «J» использует следующие правила замены:
1118623 -> "J"
.1118623 соответствует
{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1}
который можно упаковать как
{{0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} , {1, 1, 1, 1}}
это просто матрица для «J», которую мы видели выше.
Другая экономия
"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"
заключается в представлении алфавита, а не в виде списка букв.Наконец, все функции из длинной версии, кроме
h
, были интегрированы в функцию,f
а не определены отдельно.источник
{1118623, 2518818, ..., 16645599}
на это .x[[All,2,1]]
можно заменить наx[[;;,2,1]]
.Flatten[x,1]
эквивалентноJoin@@x
иFlatten[#,1]&/@x
эквивалентноJoin@@@x
. Есть несколько других незначительных оптимизаций, которые можно сделать. 551-байтовый код после этих гольфов.C #,
10401027 байтUngolfed:
В основном я нашел некоторые конкретные контрольные точки, чтобы проверить желтый / черный, чтобы определить личность каждого персонажа.
источник
csc.exe main.cs /r:System.Drawing.dll
PHP -
174116741143 байтаСначала он был создан путем изучения профилей персонажей из первых нескольких примеров, которые затем суммировали каждого персонажа в шесть чисел. Я выбрал шесть, потому что изначально у меня было пять, и это не сработало так, как хотелось бы, но шесть, кажется, работают намного лучше. Большая часть оптимизации включает сжатие этих профилей в меньшие и меньшие числа байтов.
Первый и второй профиль
*lhdfdn
и|nnmmkk
на самом деле голубая капля с «ГБ» в нижней части*
и правой границы|
, которые мы игнорируем. Безопаснее включать их, чтобы у сгустка и правой границы было что-то для сравнения.Должен обрабатывать любой формат изображения, любое разумное масштабирование, при условии, что соотношение сторон не сильно меняется, любой темный на светлом цвете, и даже немного шума и затенения!
Ему нужна граница, по крайней мере сверху и снизу, это часть профиля.
Сохраните как
ocr.php
, затем запустите из командной строки:Для тех, кто заинтересован, вот учебный код. Сохранить как
learn.php
и запустить из командной строки, без аргументов.источник
PHP,
971970 байтНичьи в большой степени на Yimin Rong «s ответ , который может быть серьезно golfed вниз, особенно индексы массива, и положить в Phar со сжатием Gzip.
Скачать фар
Это моя улучшенная базовая версия на
15571535 байт, сохраненная просто под именем «o»:Улучшения:
1-й этап
2 этап
intval
на~~
(сохраняет 8 байтов, два раза)file_get_contents($u)
заменено наjoin('',file($u))
(сохраняет 5 байтов)К сожалению, все улучшения второго этапа переводятся только в 1 байт сжатого кода. :-D
И этот код был использован для создания Phar:
Проверьте с помощью
php ocr.phar http://i.imgur.com/i8jkCJu.png
или любого другого изображения тестового примера.источник