Рисунок 14 - Формирование реальной сетки модулей
i) продолжают заполнение остальных областей данных;
1) в процессе составления области данных формируют новую L-образную структуру части данных левее или выше, используя одну из двух следующих процедур:
i) если новая область данных по-прежнему ограничена с одной стороны исходной L-образной структурой, полученной на этапе, указанном в перечислении b), повторяют этап, указанный в перечислении с), устанавливая новую область данных и используя множество точек, выбранных на этапе, указанном в перечислении е) 2), и множество точек на стороне L-образной структуры из этапа, указанного в перечислении b) 2), которые находятся за пределами линии, полученной на этапе, указанном в перечислении е) 2).
ii) если новая область данных ограничена с двух сторон другими областями данных, повторяют порядок действий с этапа, указанного в перечислении с), для определения новой области данных с помощью множества точек, выбранных на этапе, указанном в перечислении е) 2), для каждой области данных, которая примыкает и ограничивает новую область данных с двух сторон;
2) если область данных не соответствует по числу модулей ранее полученным областям данных, символ корректируют путем его уменьшения до ближайшего большего числа областей, допускаемых стандартом для символа;
3) декодируют символ с одной или несколькими областями данных, начиная с последовательности действий, установленных на этапе, указанном в перечислении k);
4) если в текущей области данных закончили просмотр последнего пика и впадины, возвращаются в предыдущую область данных и продолжают поиск с этапа, указанного в перечислении d) 6) для следующего оставшегося пика и впадины в этой области данных;
j) находят области данных прямоугольного символа:
1) для каждой стороны L-образной структуры передвигают линию поиска, перпендикулярную этой стороне, от вершины угла L-образной структуры, осуществляя сканирование по длине другой стороны L-образной структуры, сохраняя линию поиска параллельной другой стороне L-образной структуры. Каждый раз, когда линия поиска сдвигается на один пиксель изображения, подсчитывают число переходов от черного к белому и от белого к черному, начиная и заканчивая подсчет с перехода от цвета стороны L-образной структуры к противоположному цвету. Подсчет переходов следует делать только тогда, когда линия поиска имеет те же самые цвета, что и две линии непосредственно выше и ниже (левее и правее) текущей, и отличается по цвету от предыдущей линии поиска, для которой такой подсчет делался. Строят график зависимости числа переходов от расстояния , на которое сдвигают линию поиска. Продолжают, пока линия не сдвинется на длину противоположной стороны L-образной структуры +10%;
2) для каждого направления рассматривают графики , начиная с наименьших значений по оси , с постепенным увеличением значений по этой оси. Находят первое место, где значение ( - максимальное значение одной из двух величин - ноль и ) станет меньше, чем 15% предшествующего местного максимума значения , при условии, что значение больше единицы. Увеличивают значение , пока значение не перестанет уменьшаться. Если в следующей точке значение не увеличивается, увеличивают значение еще раз. Отмечают это значение как соответствующее впадине. Увеличивают значение для поиска локального максимума до тех пор, пока не начнет уменьшаться, и отмечают это значение как соответствующее пику. Точку посередине между пика и впадины отмечают как линии убывания. Линия впадины в этой точке может формировать сторону символа или его области данных;
3) ищут чередующийся шаблон поиска для каждой области данных, как описано на этапе, указанном в перечислении е);
4) составляют примерную сетку модулей области данных символа, как описано на этапах, указанных в перечислениях i), g) и h);
5) если область данных не является надлежащим прямоугольным символом, формируют новый регион данных, используя следующие пики и впадины;
6) строят все добавочные области данных, как описано на этапе, указанном в перечислении i);
7) если удалось обнаружить правильную область данных или две области, пытаются декодировать символ, как описано на этапах, указанных в перечислениях k) и l). Если область(и) не удается декодировать, исключают эту(и) область-кандидат;
k) если число модулей данных является четным числом или символ имеет надлежащую прямоугольную форму, выполняют его декодирование, используя алгоритм исправления ошибок Рида-Соломона:
1) определяют модули данных в предполагаемых центрах сетки. Темный модуль соответствует единице, светлый модуль - нулю;
2) преобразуют группы по восемь модулей по определенным шаблонам кодовых слов в 8-битовые значения знаков символа;
3) выполняют процедуру исправления ошибок Рида-Соломона с полученными значениями знаков символа;
4) декодируют знаки символа в знаки данных в соответствии с установленными схемами декодирования;
l) если число модулей данных является нечетным числом, то декодируют символ, используя алгоритм сверточного кода исправления ошибок:
1) определяют модули данных в предполагаемых центрах сетки. Темный модуль соответствует единице, светлый модуль - нулю;
2) применяют черно-белую выравнивающую маску;
3) используя соответствующую таблицу расположения битов, преобразуют данные в двоичный поток;
4) затем применяют алгоритм сверточного кода исправления ошибок;
5) преобразуют битовый поток в знаки данных, используя соответствующую схему кодирования;
6) выполняют проверку правильности контрольной суммы CRC.
Раздел 9. (Измененная редакция, Изм. N 1).