Маскирование QR

Алгоритм нанесения одного из 8 паттернов поверх данных QR-кода для равномерного распределения чёрно-белых модулей и повышения надёжности распознавания сканером.

Маскирование QR — обязательный этап кодирования, описанный в ISO/IEC 18004: после размещения данных, кодов коррекции ошибок и служебных зон на матрице кодер выполняет операцию XOR между каждым модулем области данных и булевым значением маскирующего паттерна для данной позиции. Маска не затрагивает позиционные маркеры, разделители, таймер-полосы, маркеры выравнивания и блоки формата — только модули данных и коррекции. В результате случайное чередование чёрных и белых ячеек становится статистически равномерным по всей матрице.

Цель операции двойная. Во-первых, она устраняет длинные однородные серии модулей одного цвета — такие области снижают контрастность и затрудняют детектирование границ символа. Во-вторых, маскирование предотвращает появление паттернов, визуально похожих на финдер-маркеры (три концентрических квадрата по углам): сканер мог бы ложно интерпретировать их как позиционные маркеры и не найти истинные. Оба эффекта напрямую влияют на надёжность декодирования при плохом освещении, перспективных искажениях и частичных повреждениях кода.

8 масок ISO/IEC 18004

  • Mask 0: (i + j) % 2 = 0 — чередование в «шахматном» порядке по диагоналям.
  • Mask 1: i % 2 = 0 — горизонтальные полосы, чётные строки.
  • Mask 2: j % 3 = 0 — вертикальные полосы, каждый третий столбец.
  • Mask 3: (i + j) % 3 = 0 — диагональные полосы с шагом 3.
  • Mask 4: (⌊i/2⌋ + ⌊j/3⌋) % 2 = 0 — блочная решётка 2×3 модуля.
  • Mask 5: (i·j) % 2 + (i·j) % 3 = 0 — разреженный паттерн на пересечениях произведений.
  • Mask 6: ((i·j) % 2 + (i·j) % 3) % 2 = 0 — более плотная версия mask 5.
  • Mask 7: ((i + j) % 2 + (i·j) % 3) % 2 = 0 — комбинированный паттерн суммы и произведения.

Здесь i — номер строки, j — номер столбца (оба отсчитываются от нуля, начиная с верхнего левого угла матрицы данных). Модуль инвертируется, если выражение истинно.

Как выбирается маска

Кодер применяет все 8 масок поочерёдно и для каждого варианта вычисляет штрафной балл (penalty score) по четырём правилам стандарта: N1 — длинные серии одноцветных модулей в строках и столбцах; N2 — блоки 2×2 и крупнее одного цвета; N3 — паттерны, похожие на финдер-маркеры; N4 — отклонение доли тёмных модулей от 50 %. Итоговый штраф — сумма четырёх составляющих.

Побеждает маска с наименьшим суммарным penalty score. Номер выбранной маски (3 бита) записывается в блок информации о формате, который размещается рядом с финдер-маркерами и дублируется в двух зонах матрицы. Декодер читает блок формата, восстанавливает номер маски и применяет тот же XOR-паттерн для получения исходных битов данных. Именно поэтому дизайн и сканирование QR неразрывно связаны: произвольная окраска модулей поверх кода может разрушить блок формата или исказить penalty-оценку, выбранную при генерации.

Частые вопросы

Почему нельзя обойтись одной универсальной маской?

Ни один фиксированный паттерн не даёт оптимального результата для любой последовательности данных. Разные данные порождают разные распределения битов на матрице, и маска, уменьшающая penalty для одного QR-кода, может ухудшить его для другого. Именно поэтому стандарт требует перебора всех 8 вариантов и выбора по минимальному штрафу.

Влияет ли маска на объём данных или уровень коррекции ошибок?

Нет. Маскирование — чисто оптическая операция: оно не изменяет количество модулей, не добавляет и не убирает байты данных, не меняет уровень коррекции (L/M/Q/H). XOR с маской обратим: та же операция применяется при декодировании и полностью восстанавливает исходные биты. Ёмкость кода и устойчивость к повреждениям определяются до этапа маскирования.

Что произойдёт, если маска применена неверно или не применена вовсе?

Декодер прочитает блок формата, увидит несоответствие ожидаемому паттерну и либо попытается скорректировать ошибку с помощью BCH-кода (блок формата защищён 10-битным BCH(15,5)), либо вернёт ошибку декодирования. На практике пропуск маскирования делает код нечитаемым для всех стандартных сканеров — даже если сами данные записаны корректно. Можно создать QR-код с автоматическим подбором оптимальной маски.

Маскирование QR — 8 паттернов по ISO/IEC 18004