Інформаційні технології Лабораторна робота №4
Дослідження принципів заводостійкого кодування.
QR-коди
МЕТА Р ОБОТИ – ознайомитися з особливост ями завадостійкого
кодування інформації на прикладі QR -кодів; навчитись проводити ручне
декодування такої інформації.
1. ОСНОВНІ ВІДОМОСТІ
1.1. Технології двовимірного завадостійкого кодування
Прикладом застосування сучасних інформаційних технологій у
повсякденному житті можна вважати QR –коди, які забезпечують завадостійке
кодування. Інформація кодується за допомогою матриці чорних і білих квадратів,
які після сканування перетворюються в логічні 1 та 0. Формування зображень
матриць ведеться таким чином, щоб забезпечити найбільш сприятливі умови для
роботи скануючої апаратури. Для цього в процесі кодування створюється декілька
графічних матриць і вибирається найкраща з них. Якщо в процесі експлуатації
з’являються спотворення рисунку матриці, то їх усунення відбувається шляхом
використання завадостійкого коду Ріда-Соломона.
QR-код (англ. Quick response – швидкий в ідгук) – матричний код,
розроблений японською компанією «Denso -Wave» в 1994 році. Місткість однієї
кодової матриці не є безмежною. Максимальна кількість символів, які можна
помістити в одну матрицю, залежить від виду інформації, що кодується (цифри,
букви, двійковий код, ієрогліфи), рівня корекції помилок і версії QR -коду. Для
версії 40 в одній матриці при мінімальному рівні корекції помилок можна
розмістити 7089 десяткових цифр, або 4296 букв і цифр, або 2953 двійкових даних
(байт), або 1817 ієрогліфів.
Найбільшого поширення розглянутий код отримав серед абонентів
мобільного зв'язку. Користувач може швидко занести в свій мобільний пристрій
текстову інформацію, контакти в адресну книгу, перейти за Web -посиланням,
відправити SMS -повідомлення і т.д. За допомо гою QR -кодів зручно робити
візитки і розміщувати їх на різних речах та поверхнях . Для того щоб зробити
туристичні маршрути більш інформативними, на вулицях Львова розміщено
понад 80 зображень QR-кодів. Ними обладнані комерційні та культурні об'єкти, в
тому числі пам'ятники, архітектурні споруди.
QR-коди використовуються для маркування важливих деталей. Гравірування
металевої поверхні дозволяє наносити код на деталі, що піддаються впливу
високих температур, тиску або агресивних хімічних речовин. Даний код м ає
високу стійкість по відношенню до спотворень. Навіть при наявності пошкоджень
зображення на площі 30% все ще є можливість безпомилково зчитувати
інформацію.
QR-код не є єдиним варіантом двомірного штрих -коду. Відомі й інші
формати: DataMatrix, ScanLife EZcode і Microsoft Tag (Tag).
Три квадрати в кутах зображення QR -коду дозволяють пристрою правильно
визначати його просторову орієнтацію. Чорні та білі пікселі зображення
перетворюються зчитувальним пристроєм у двійкові числа. Потім проводиться
обробка ци фрової інформації. На матриці розміщується системна інформація,
інформаційні біти, коригувальні біти. При обробці зображення використовується
алгоритм Ріда -Соломона, який дозволяє усунути третину можливих спотворень
матриці.
QR-коди можна створювати з різ ним ступенем завадостійкості. Чим вищ а
завадостійкість, тим більше надлишкової інформації містить матриця і тим менше
залишається місця для інформаційних бітів.
Графічну матрицю можна створити з одним з чотирьох рівнів корекції
помилок. Ці рівні визначают ь частку інформації, що підлягає відновленню за
рахунок використання коригуючого коду (Табл. 1).
Таблиця 1
Рівень корекції помилок Код Припустимі спотворення
L 01 7%
M 00 15%
Q 11 25%
H 10 30%
Рівні L і M рекомендується використовувати для друку кодів на різних типах
поліграфічної продукції (оголошеннях, квитках, візитках тощо) . Рівні Q і H
застосовують для маркування промислових деталей, коли існує висока
ймовірність пошкодження зображення коду. В рис. 1 показано, як виглядає код
слова «Проба» при різних рівнях корекції помилок. Візуально можна помітити,
що зі збільшенням рівня завадостійкості число елементів в матриці зростає.
Слід звернути увагу, що зчитування інформації припиняється у випадках,
коли істотно спотворений один з трьох квадратів, що відповідають за визначення
орієнтації матриці. Інформаційні біти, контрольні біти і системна інформація
розташовуються в певних місцях матриці. Порядок розміщення всіх елементів
матриці визначено правилами, які описані в специфікації [1].
Рис. 1. Різні рівні корекції помилок
Розглянемо порядок розташування елементів матриц і бі льш детально
(рис. 2). На кожній матриці є три покажчика орієнтації 1 (ПО). Між трьома ПО
проходять дві лінії синхронізації 2, які складаються з білих і чорних пікселів, що
чергуються. Поблизу лівого нижнього покажчика орієнтації розміщується чорний
піксель 3.
На сьогодні створено 40 версій QR -кодів. На матрицях QR-кодів, починаючи
з версії 2, є мітки центрування 4. У версії 1 такої мітки немає, але в пізніших
версіях QR-коду можна нарахувати до 46 таких міток.
В областях 5 для версій пізніших шостої
розміщується інформація про версії коду. У
чотирьох пікселях 6 розташовано код, що
визначає, який вид даних міститься в матриці.
Системна інформація розміщується в
областях 7 і 8.
Інформація про рівень корекції помилок і
вигляд використаної маски розташовується в
системному рядку (нижній рис.) . Розряди 14 і
13 містять відомості про використаний рівень
корекції помилок. Розряди 12, 11 і 10
показують, яка маска використана для
накладення на інформаційні та коригувальні
біти. Три біти дозволяють сформувати коди
для восьми різних масок. Системна
інформація дублюється. Один раз 15
системних бітів розміщують в стовпці 8
(рахунок елементів ведеться, починаючи з 0 з
лівого верхнього кута матриці). Другий раз
системну інформацію розміщують в рядку 7.
Найбільш просто операція декодування
виконується за допомогою мобільного
телефону або планшета з вбудованою
фотокамерою і встановленою програмою зчитування.
Зі збільшенням номера версії QR-коду обсяг даних, що поміщаються в
матрицю, збільшується. Визначити, до якої версії відноситься ця матриця, можна
трьома способами:
- підрахувати яку кількість пікселів містить матриця;
- визначити координати міток центрування;
- для версій пізніших шостої існують області на матриці, де міститься
інформація про версію QR-коду.
У таблиці 3 наведено інформацію про кількість пікселів для різних версій
QR-кодів.
Рис. 2. Порядок елементів матриці
Таблиця 3
Версія Число пікселів
1 21×21
2 25×25
3 29×29
… …
40 177×177
Аналізуючи наведену таблицю, легко помітити лінійну закономірність:
наступна версія QR -коду відрізняється від попередньої версії тим, що сторона
матриці збільшена на 4 пікселі. Підрахувавши число пікселів, можна визначити
версію QR -коду для даної матриці. У таблиці 4 наведено дані про координати
міток центрування для версій 2 ... 13.
Таблиця 4
Версія Рядки Версія Рядки
2 6 18 8 6 24 42
3 6 22 9 6 26 46
4 6 26 10 6 28 50
5 6 30 11 6 30 54
6 6 34 12 6 32 58
7 6 22 38 13 6 34 62
На рис. 3 для прикладу показано зображення матриці QR-коду версії 7.
З рисунка видно, що шість міток центрування розташовані в рядках,
зазначених в табл . 4. Координати визначаються за чорн им піксел ем,
розташованим у межах білого квадрата. Мітки центрування не ставляться в
місцях, де розташовані покажчики орієнтації (три кути).
На матрицях, починаючи з версії 7, є дві області, де міститься закодована
інформація про використану версію. Ці області відзначені на рис. 3 цифрами 1 і 2.
У табл. 5 наведено коди деяких версій QR-коду.
Рис. 3. Матриця QR-коду версії 7
Рядок 22
Рядок 38
Таблиця 5
Версія Код
7 001010010011111000
8 000111101101000100
9 100110010101100100
10 011001011001010100
11 011011111101110100
12 001000110111001100
13 111000100001101100
Наступні дві таблиці 6 і 7 показують, в якому порядку розміщують ся біти
вісімнадцятирозрядного коду, який визначає версію програми.
Таблиця 6 Таблиця 7
Розглянемо, як визначити рівень корекції помилок. Т ак як системна
інформація дублюється, то відомості про наявну коректуючу здатність коду
можна відшукати в двох місцях матриці. Один раз 15 біт системної інформації
розміщено в рядку 1 (відлік зліва направо), а другий раз - в стовпці 2 (відлік
знизу-вгору). Відомості про рівень корекції помилок містяться в перших двох
бітах системної інформації. Ці два біта розташовані в 14 і 13 розрядах системного
рядка.
На наступному рисунку 4 перші два біти в системному рядку рівн і 1.
Нагадаємо, що логічні одиниці зображені у вигляді чорних пікселів, а логічні нулі
- у вигляді білих. Щоб визначити рівен ь корекції, потрібно ці два біти додати за
правилом «Виключного Або» (XOR) з двійковою маскою 10.
Рис. 4. Біти рівня корекції помилок 11
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
0 3 6 9 12 15
1 4 7 10 13 16
2 5 8 11 14 17
В результаті додавання отримаємо: 11
10 = 01.
Код 01 відповідає рівню корекції помилок L (7%).
На рисунку 5 показана матриця, в якій використано інший рівень корекції
помилок. Перші два біта в цьому випадку дорівнюють 10. Підсумовування з
маскою 10 дає результат 00. Це вказує на те, що в цій матриці використан о код з
рівнем корекції помилок М (15%).
Рис. 5. Біти рівня корекції помилок 10
Аналогічно проводяться обчислення для матриць з рівнями корекції помилок
Q і H. На цих матрицях системна інформація починається бітами 01 (Q) і 00 (H).
Підсумовування з маскою 10 дасть відповідно двійкові коди 11 і 10.
Для підвищен ня надійності сканування матрицю додатково перетворюють.
Метою цього перетворення є формування такого рисунку (конфігурації) матриці,
на якому було б якомога менше суміжних пікселів однакового кольору.
Простими словами цю вимогу можна сформулювати так: «Матриця повинна
бути строкатою і на ній повинно бути мінімум монотонних суцільних протяжних
ділянок». Цим полегшується робота скануючої апаратури, наприклад, фотокамер
мобільних телефонів.
Вказана м ета досягається таким чином: формують 8 матриць з однаковим
інформаційним змістом, але різного виду (різної форми). Для цього
використовують 8 заздалегідь підготовлених масок, які підсумовують з вихідною
матрицею за правило м XOR. Отримані матриці почергово перетворюють, в
результаті вибирають одну матрицю. Відбір матриць здійснюють шляхом
обчислення штрафних балів. Для оптимальної (найбільш «строкатої») матриці
число штрафних балів буде мінімальним серед восьми. Вісім масок кодуються
трирозрядними числами від 000 до 111. Математично маски описуються
формулами, наведеними в табл. 8.
Таблиця 8
У табл. 8 використані позначення: i – номер рядка матриці; j – номер стовпця;
mod – операція пошуку залишку від цілочисельного ді лення; div – операція
цілочисельного ділення.
Порядок визначення координат модулів ілюструє рис. 6.
Формули використовуються наступним чином: якщо координати
розглянутого пікселя матриці задовольняють даному співвідношенню (в табл. 8) ,
то цей піксель інвертується.
При кодуванні конкретних повідомлень їх вміст буває найрізноманітнішим.
В одному випадку це тільки десяткові цифри, в іншому – букви і цифри, в
третьому – двійкові дані (байти), в четвертому – ієрогліфи.
Залежно від виду використовуваних даних зап ис бітів в матрицю
відбувається в різних форматах. Вид формату вказується за допомогою чотирьох
бітів, розташованих в області 6 (див. рис. 2).
Рис. 6. Порядок відліку рядків та стовпців Рис. 7. Порядок бітів формату даних
Слід звернути увагу, що в області 6 інформація про формат даних
«спотворена» маскою. Причому в кожному випадку маска може бути будь -якою з
восьми можливих. Тому для отримання справжнього значення коду формату
даних потрібно попередньо визначити вид використаної маски.
Порядок нумерації бітів показаний на рис. 7, причому старший розряд коду
формату знаходиться в клітинці, позначеній цифрою 1.
1.2. Декодування матриці QR-коду
Розглянемо порядок ручного декодування матриці, зображеної на рис. 8.
Рис. 8. Зразок QR-коду для декодування
Спочатку потрібно визначити, який вид маски використаний при її
кодуванні. У розрядах 12, 11 і 10 системного рядка записано бінарне слово 111.
Додавання зі статичною маскою 101 дає двійкове число 010. За таблицею кодів
маски легко визначити формулу, використану для формування маски:
j mod 3
0
За цією формулою можна визначити вид розрахункової маски (див. рис. 9, а).
Цей рисунок потрібно трактувати таким чином: якщо на масці є чорний піксель,
то піксель матриці з такими ж координатами потрібн о проінвертувати. У цього
правила велике число винят ків. На рис. 9 в) показані сірим кольором модулі, які
інвертувати не слід.
Аналізуючи рисунок 9 в ), можна помітити, що від зміни захищені області
матриці, де розташовані покажчики орієнтації, ліні ї синхронізації, системна
інформація (сірі модулі). Скориговану таким чином розрахункову маску назвемо
фактичною маскою. Процес наклада ння фактичної маски на матрицю, що
декодують, показаний на рис. 10 нижче.
Рис. 9. Вид розрахункової та фактичної маски
Рис. 10. Накладання маски на матрицю
Найбільший інтерес для декодування представляє область матриці, що
розташована в правому нижньому кут і. Тут знаходяться інформаційні біти.
Розглянемо більш детально цю частину. На рис. 11, а) наведено фрагмент вихідної
матриці, який повинен бут и обробленим. На рисунку 11 , б) виділені пікселі, які
повинні бути проінвертовані. Слід звернути увагу, що верхня межа рисунка
збігається з системн им рядком. Результат накладення маски і декоду вання
матриці показаний на рис. 11, в).
а) б) в)
Рис. 11. Накладання маски на матрицю
З рисунку 11, в) видно, що пікселі третього і шостого стовпця праворуч були
проінвертовані. Тепер є можливість виконати ручне декодування матриці. Чотири
біти в клітинках 1 ... 4 дають код 0100, який вказує на те , що в даній матриці
використовується двійковий формат даних. Порядок зчитування деко дованої
інформації показаний на рисунку 12.
а) б) в)
Рис. 12. Порядок зчитування інформаційних бітів
Відповідно до двійкового формату даних наступні 8 біт (клітинки 5 ... 12)
вказують, скільки символів міститься в повідомленні. Двійкове число 00000101
вказує на те, що дане повідомлення містить 5 символів. У наступних восьми
клітинках 13 ... 20 (див. рис. 12,а)) розміщено двійкове слово 01010000. Запис
цього байта в десятковій системі числення дає число 80. За таблицею CP -1251
легко визначити, що цьому коду відповідає латинська літера «Р». Слід звернути
увагу на порядок нумерації пікселів. Номери розташовуються один за одним у
вигляді «змійки». Результати декодування повідомлення наведено в табл. 9.
Таблиця 9
Номери пікселів Біти Десяткове число Символ
13…20 01010000 80 P
21…28 01110000 114 r
29…36 01101111 111 o
37…44 01100010 98 b
45…52 01100001 97 a
Таким чином, в результаті ручного декодування було визначено, що матриця
містить слово «Proba».
1.2. Порядок вибору кодованої матриці
При кодуванні повідомлення формують вісім матриць з однаковим змістом,
але різної форми (з накладанням 8 -ми різних масок) . Для вибору однієї з восьми
конкуруючих матриць в стандарті визначено чотири правила розрахунку штрафів.
Відповідно до першого пра вила штраф призначається за кожну групу з п'яти або
більше одноколірних пікселів в одному рядку. Штрафні функції за стовпцями
обчислюються аналогічно. Друге правило дає штраф за кожен одноколірний
квадрат розміром 2x2 пікселя. Третє правило визначає штраф, якщо на матриці є
області, які схожі на покажчики визначення орієнтації. Четверте правило
нараховує штраф, якщо більше половини пікселів одного кольору. Метою
розрахунку штрафних балів є вибір найбільш «строкатої» матриці з восьми
можливих варіантів.
Для прикладу, розглянемо матрицю, використану при декодуванні (див.
рис. 8). Обчислимо штрафні бали порядково за першим правилом. Перший зверху
рядок матриці містить велику кількість суміжних чорних пікселів (дві групи
монотонних пікселів , рис. 13 ). Це вказує на те, що для першого рядка буде
нараховано велике число штрафних балів.
Рис. 13. Послідовність пікселів 1-го рядка
Розрахунок ведеться в такий спосіб. Якщо в рядку є група з п'яти суміжних
одноколірних пікселів, то нараховується три штрафні бали. За ко жний наступний
піксель, який примикає до групи, нараховується додатково по одному балу. Таким
чином, перша група чорних пікселів дає внесок 3 + 1 + 1 = 5 балів. Друга група з
семи чорних пікселів також дає 5 штрафних балів. В цілому перший рядок дав 10
штрафних балів. Другий рядок матриці показано на наступному рисунку.
Рис. 14. Послідовність пікселів 2-го рядка
У цьому рядку є дві групи по п'ять білих пікселів. Ці дві групи в сумі дають 6
штрафних балів. Аналогічна методика підрахунку штрафних балів
використовується і для стовпців. На рис. 15 наведено штрафні бали за всіма
рядками та стовпцями матриці.
Рис. 15. Кількість штрафних балів за рядками та стовпцями
Далі розраховуються сумарні значення штрафних балів за рядками і за
стовпцями. Для розглянутого прикладу сумарна кількість штрафних балів за
рядками дорівнює 88, а за стовпцями 102. Загальна кількість штрафних балів, що
обчислена за першим правилом для даної маски, дає число 190.
Використовуючи всі чотири правила розрахунку штрафних балів, знаходять
сумарну кількісну оцінку даної маски. Подібні оцінки отримують для всіх восьми
масок. Серед цих оцінок вибирають мінімальну оцінку і для остаточного
кодування використовують маску, яка має мінімальне число штрафних балів.
2. ЗАВДАННЯ
2.1. Ознайомитись із теоретичними відомостями побудови QR-коду.
2.2. За допомогою web -сторінки генерації QR -кодів закодувати власне
прізвище латинськими літерами у форматі прізвище_іб, з рівнями завадостійкості
L, M та Q.
2.3. Для коду з рівнем завадостійкості L провести ру чне декодування
перших 20 біт інформації – визначити тип даних (1..4), кількість байт даних (5..12)
та 1-й символ (13..20).
2.4. За допомогою скрипта Matlab/Scilab повністю розкодувати QR -код з
рівнем L в автоматичному режимі. Отримати підтвердження результатів з п. 2.3.
2.5. У файли згенерованих QR -кодів за допомогою програми графічного
редактора (напр. MS Paint) внести довільні ( окрім блоків орієнтування,
центрування та ліній синхронізації ) спотворення у кількості менше та більше
відповідного рівня завадостійкості.
2.6. За допомогою мобільного пристрою або web -cторінки сканування QR-
кодів розкодувати повідомлення початкових та спотворених зображень. Для
кожного рівня завадостійкості визначити максимальну кількість спотворених біт
при яких вдається повністю відновити закодований текст.
2.7. Зробити висновки щодо коректуючої здатності QR-кодів.
2.8. Оформити звіт.
3. ПОРЯДОК ВИКОНАННЯ РОБОТИ
3.1. Генерація QR -коду. В мережі Інтернет знайти web-cторінку для
генерації QR-кодів з різними рівнями завадостійкості. У відповідне поле сторінки
ввести текст у форматі прізвище_іб латинськими літерами, зберегти зображення
згенерованого коду для рівнів L, M, Q з іменами прізвище_L, прізвище_M,
прізвище_Q.
3.2. Ручне декодування QR-коду. Згідно методичних вказів ок виконати
покрокове ручне декодування перших 20 біт повідомлення для файла прізвище_L.
Для цього необхідно:
– визначити код рівня заводостійкості (00..11);
– код маски (000..111);
– розрахувати фрагмент маски для перших 20 біт;
– накласти маску на QR-код (операція XOR);
– одержати перших 20 біт повідомлення.
3.3. Cтворення скрипт файла для автоматичного декодування QR-коду.
Використовуючи шаблон (див. додаток) створити скрипт в середовищі
Matlab/Scilab для автоматичного декодува ння QR-коду. У скрипті с тудент
заповнює матрицю QR_code бітами з файла прізвище_L а також задає код для
розрахунку матриці маски Mask. Початковий вивід має відповідати результатам
ручного декодування.
3.4. Внесення спотворень у QR-коди. За допомогою графічного редактора
зафарбовуємо окремі біти зображень файлів прізвище_L, прізвище_M, прізвище_Q
зберігаючи їх як окремі файли з іменами формату прізвище_X_bad_x (де Х –
рівень корекції, x – кількість спотворених біт).
QR-код файла Сyber_L QR-код файла Сyber_L_bad_4
3.5. Розкодування початкових та спотворених QR -кодів. За допомогою
мобільного пристрою або web -cторінки сканування QR-кодів розкодувати
повідомлення початкових та спотворених зображень. Для кожного рівня
завадостійкості визначити максимальну кількість спотворених біт при яких
вдається повністю відновити закодований текст.
Розкодування файла Сyber_ Q_bad_9 Розкодування файла Сyber_ Q_bad_10
3.6. Визначення коректуючої здатності QR-кодів. За результатами
попереднього пункту з робити висновки щодо коректуючої здатності QR-кодів
заповнивши таку таблицю
Таблиця
Максимальна к-ть допустимих спотворень, бітЗакодоване
повідомлення
Кількість
інформації,
біт L (7%) M (15%) Q (25%)
прізвище_іб
Результати дослідження перенести у звіт до лабораторної роботи.
4. ЗМІСТ ЗВІТУ
Звіт повинен містити : мету р оботи, за вдання, зображення згенерованих
QR-кодів, текст скрипт-файла для автоматичного розкодування QR-коду з рівнем
L, результати викон ання скрипта з командного вікна Matlab/Scilab, зображення
спотворених QR-кодів, результати сканування, порівняльну таблицю, висновки.
5. КОНТРОЛЬНІ ПИТАННЯ
1. Які рівні корекції помилок використовують в QR-кодах?
2. Де розташовані покажчики орієнтації?
3. Які позиції на QR-коді визначають тип маски?
4. Для чого відбувається підрахунок штрафів?
5. Де використовуються QR-коди?
6. Яким чином зловмисники можуть використати QR-коди?
Додаток
1. Приклад реалізації скрипта для автоматичного декодування QR-коду
в середовищі Matlab
%/////////////// Cкрипт до лабораторної роботи №4
///////////////////%
clc;
n=21; % розмірність QR коду n x n пікселів
%(для версії 1 розмірність 21 x 21)
% 1 -> Заповнюємо матрицю QR-коду
/////////////////////////////////////
% V V
%1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
QR_code = [0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 1
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 2
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 3
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 4
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 5
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 6
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; % 7
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 8
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0; % 9
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1; % 10 V
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1; % 11
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1; % 12
1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1; % 13 V
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 14
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 15
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 16
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 17
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 18
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 19
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1; % 20
0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1] % 21
%V
Mask = zeros (n,n);
% 2 -> Задаємо код для розрахунку маски
/////////////////////////////
% в фрагменті нижче реалізовано маску 111
for i=0:n-1
for j=0:n-1
if (mod((mod (i*j,3)+i+j),2) == 0)
Mask(i+1,j+1)= 1;
end
end
end
% 3 -> Розрахунок фактичної маски
////////////////////////////////////
Mask(1:9,1:9) = 0; % нейтралізація маски
Mask(1:9,end-7:end) = 0; % в блоках
Mask(end-7:end,1:9) = 0; % орієнтування
Mask(10:end-8,7) = 0; % нейтралізація маски
Mask(7,10:end-8) = 0; % в лініях синхронізації
% 4 -> Накладання маски на QR-код
////////////////////////////////////
Matrix = xor(Mask, QR_code);
% видаляємо лінії синхронізації
Matrix(:,7) = [];
Matrix(7,:) = [];
% відповідно розмірність матриці зменшилася на 1
j = n-1;
infobits = []; % вектор інформаційних бітів
while (j>0)
if (j>(n-1-8)) start = n-1; stop = 9;
elseif (j > 9) start = n-1; stop = 1;
else start = n-1-8; stop = 9;
end
column_1 = Matrix(stop:start,j-1:j);
column_2 = Matrix(stop:start,j-3:j-2);
t3 = [(fliplr(flipud(column_1)))' (fliplr(column_2))'];
infobits = [infobits; t3(:)];
j = j-4;
end
% 5 -> Визначення типу даних та к-ті інформації
////////////////////////////////////
% кількість байт закодована в QR-коді
num = polyval(infobits(5:12),2);
fprintf('************************************\n');
fprintf('>>> %s %d%d%d%d\n', 'Data Type code:', infobits(1:4));
fprintf('>>> %s %d', 'Number of bytes:', num);
fprintf('\n************************************\n');
% Вивід розкодованої інформації
for i=1:num
c = polyval(infobits(5+i*8:12+i*8),2);
fprintf('>>> %d byte code: 0x%x -> ''%c''\n', i, c, c);
end
2. Порядок зчитування інформації в QR-коді (v. 1)