Матричні перетворення - малюємо гриб

Кафедра ШІзики

Автор

15 хвилин

Час читання

24.07.2025

Дата публікації

Рівень:
Початківець
Теги: #матриці #трансформації #обробка-зображень #візуалізація #математика

Лекція 3: Матричні перетворення – Магія трансформації даних 🎨

У попередніх лекціях ми дізналися, що матриці можуть зберігати дані та виконувати над ними операції. Але справжня магія починається, коли ми використовуємо матриці для перетворення даних. Сьогодні ми намалюємо гриб числами і навчимося його трансформувати!

⚠️ Навчальне спрощення:
Усі приклади в цій лекції спрощені для кращого розуміння концепцій. Реальні алгоритми обробки зображень можуть бути складнішими. Матриця 10×10 використовується лише для наочності – справжні зображення мають сотні або тисячі пікселів у кожному вимірі. Візуалізації та розрахунки можуть бути наближеними для збереження простоти пояснення.

Малюємо гриб матрицею 🍄

Уявімо, що в нас є зображення гриба. Зображення це фактично матриця пікселів, де кожен з них має свої певні характеристики, в нашому випадку зупинимось на кольорі.

Отже, нехай ми маємо наступну палітру кольорів:

  • 0 = чорний (⬛)
  • 1 = темно-сірий (🔲)
  • 2 = світло-сірий (🔳)
  • 3 = білий (⬜)

А отже, наш гриб у вигляді матриці 10×10 і за нашою палітрою буде виглядати ось так:

Гриб=(0000000000001222210001233332100233113320023133132001233332100001221000000122100000012210000000110000)\text{Гриб} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 2 & 2 & 2 & 1 & 0 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 2 & 3 & 3 & 1 & 1 & 3 & 3 & 2 & 0 \\ 0 & 2 & 3 & 1 & 3 & 3 & 1 & 3 & 2 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 \end{pmatrix}

Візуалізація:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛

Розпізнавання образів – як ШІ “бачить” гриб? 👁️

Перш ніж трансформувати зображення, давайте зрозуміємо, як комп’ютер взагалі розпізнає, що на картинці є гриб. Це основа комп’ютерного зору!

Еталонний гриб (те, що ми шукаємо):

Еталон=(0011111100012233221012333333211332112331123333332101222222100001221000000122100000011110000000000000)\text{Еталон} = \begin{pmatrix} 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 2 & 2 & 3 & 3 & 2 & 2 & 1 & 0 \\ 1 & 2 & 3 & 3 & 3 & 3 & 3 & 3 & 2 & 1 \\ 1 & 3 & 3 & 2 & 1 & 1 & 2 & 3 & 3 & 1 \\ 1 & 2 & 3 & 3 & 3 & 3 & 3 & 3 & 2 & 1 \\ 0 & 1 & 2 & 2 & 2 & 2 & 2 & 2 & 1 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Наше зображення (трохи інший гриб):

Наш гриб=(0000000000001222210001233332100233113320023133132001233332100001221000000122100000012210000000110000)\text{Наш гриб} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 2 & 2 & 2 & 1 & 0 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 2 & 3 & 3 & 1 & 1 & 3 & 3 & 2 & 0 \\ 0 & 2 & 3 & 1 & 3 & 3 & 1 & 3 & 2 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 \end{pmatrix}

Візуалізації для порівняння:

Еталон:

⬛⬛🔲🔲🔲🔲🔲🔲⬛⬛
⬛🔲🔳🔳⬜⬜🔳🔳🔲⬛
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲⬜⬜🔳🔲🔲🔳⬜⬜🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
⬛🔲🔳🔳🔳🔳🔳🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛

Наш гриб:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛

Як порівняти? Обчислюємо різницю:

Різниця=ЕталонНаш гриб\text{Різниця} = |\text{Еталон} - \text{Наш гриб}|

Де |…| означає абсолютне значення кожного елемента.

Результат:

Різниця=(0011111100011011011011100001111100001011100200200100011110000000000000000000000000001100000000000000)\text{Різниця} = \begin{pmatrix} 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 & 1 & 0 \\ 1 & 1 & 1 & 0 & 0 & 0 & 0 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 2 & 0 & 0 & 2 & 0 & 0 & 1 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Візуалізація різниці (чим світліше, тим більша різниця):

⬛⬛🔲🔲🔲🔲🔲🔲⬛⬛
⬛🔲🔲⬛🔲🔲⬛🔲🔲⬛
🔲🔲🔲⬛⬛⬛⬛🔲🔲🔲
🔲🔲⬛⬛⬛⬛🔲⬛🔲🔲
🔲⬛⬛🔳⬛⬛🔳⬛⬛🔲
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛

Оцінка схожості:

Крок 1: Рахуємо суму всіх різниць

Додаємо всі числа з матриці різниць:

  • Рядок 1: 0+0+1+1+1+1+1+1+0+0 = 6
  • Рядок 2: 0+1+1+0+1+1+0+1+1+0 = 6
  • Рядок 3: 1+1+1+0+0+0+0+1+1+1 = 6
  • Рядок 4: 1+1+0+0+0+0+1+0+1+1 = 5
  • Рядок 5: 1+0+0+2+0+0+2+0+0+1 = 6
  • Рядок 6: 0+0+0+1+1+1+1+0+0+0 = 4
  • Рядки 7-8: всі нулі = 0
  • Рядок 9: 0+0+0+0+1+1+0+0+0+0 = 2
  • Рядок 10: всі нулі = 0

Сума всіх різниць: 6+6+6+5+6+4+0+0+2+0 = 28

Крок 2: Обчислюємо максимально можливу різницю

Якби наш гриб був повністю протилежним еталону:

  • Кожен піксель міг би відрізнятися максимум на 3 (від 0 до 3)
  • У нас 10×10 = 100 пікселів
  • Максимальна різниця: 100 × 3 = 300

Крок 3: Переводимо в відсоток схожості

Схожість=Макс. різницяФактична різницяМакс. різниця×100%\text{Схожість} = \frac{\text{Макс. різниця} - \text{Фактична різниця}}{\text{Макс. різниця}} \times 100\% Схожість=30028300×100%=272300×100%=90.7%\text{Схожість} = \frac{300 - 28}{300} \times 100\% = \frac{272}{300} \times 100\% = 90.7\%
Висновок: З 90.7% схожістю це справді гриб! 🎉
ШІ вважає зображення грибом, якщо схожість > 85%

Де найбільші відмінності?

Дивлячись на матрицю різниць, бачимо:

  • Капелюшок ширший в еталоні (верхній рядок)
  • Плямки на капелюшку розташовані по-різному (значення 2 в рядку 5)
  • Ніжка коротша в нашому грибі (різниця в останньому рядку)

Саме так працюють алгоритми розпізнавання образів – порівнюють матриці пікселів!

Інверсія кольорів – негатив зображення 🔄

Щоб створити негатив, віднімаємо кожне значення від максимального (3):

Негатив=3Гриб\text{Негатив} = 3 - \text{Гриб}

Операція поелементно:

  • Чорний (0) → Білий (3)
  • Темно-сірий (1) → Світло-сірий (2)
  • Світло-сірий (2) → Темно-сірий (1)
  • Білий (3) → Чорний (0)
Негатив=(3333333333332111123332100001233100220013310200201332100001233332112333333211233333321123333333223333)\text{Негатив} = \begin{pmatrix} 3 & 3 & 3 & 3 & 3 & 3 & 3 & 3 & 3 & 3 \\ 3 & 3 & 2 & 1 & 1 & 1 & 1 & 2 & 3 & 3 \\ 3 & 2 & 1 & 0 & 0 & 0 & 0 & 1 & 2 & 3 \\ 3 & 1 & 0 & 0 & 2 & 2 & 0 & 0 & 1 & 3 \\ 3 & 1 & 0 & 2 & 0 & 0 & 2 & 0 & 1 & 3 \\ 3 & 2 & 1 & 0 & 0 & 0 & 0 & 1 & 2 & 3 \\ 3 & 3 & 3 & 2 & 1 & 1 & 2 & 3 & 3 & 3 \\ 3 & 3 & 3 & 2 & 1 & 1 & 2 & 3 & 3 & 3 \\ 3 & 3 & 3 & 2 & 1 & 1 & 2 & 3 & 3 & 3 \\ 3 & 3 & 3 & 3 & 2 & 2 & 3 & 3 & 3 & 3 \end{pmatrix}

Візуалізація негативу:

⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜
⬜⬜🔳🔲🔲🔲🔲🔳⬜⬜
⬜🔳🔲⬛⬛⬛⬛🔲🔳⬜
⬜🔲⬛⬛🔳🔳⬛⬛🔲⬜
⬜🔲⬛🔳⬛⬛🔳⬛🔲⬜
⬜🔳🔲⬛⬛⬛⬛🔲🔳⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜⬜🔳🔳⬜⬜⬜⬜

Тепер наш гриб світиться на темному фоні! ✨

Горизонтальне відзеркалення 🪞

Для відзеркалення по горизонталі просто переставляємо стовпці в зворотному порядку:

Дзеркало=(0000000000001222210001233332100233113320023133132001233332100001221000000122100000012210000000110000)×P\text{Дзеркало} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 2 & 2 & 2 & 1 & 0 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 2 & 3 & 3 & 1 & 1 & 3 & 3 & 2 & 0 \\ 0 & 2 & 3 & 1 & 3 & 3 & 1 & 3 & 2 & 0 \\ 0 & 1 & 2 & 3 & 3 & 3 & 3 & 2 & 1 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0 & 0 \end{pmatrix} \times P

Де P – матриця перестановки для відзеркалення:

P=(0000000001000000001000000001000000001000000001000000001000000001000000001000000001000000001000000000)P = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Візуалізація відзеркаленого гриба:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛

гриб дивиться в інший бік! (Хоча в цьому випадку він симетричний)

Виділення частин зображення – маска 🎭

Хочемо виділити тільки капелюшок гриба? Створюємо матрицю-маску:

Як будуємо маску:

  1. Визначаємо область капелюшка: дивимось на оригінальний гриб і бачимо, що капелюшок займає рядки 1-6
  2. Ставимо 1 там, де хочемо зберегти зображення: в області капелюшка
  3. Ставимо 0 там, де хочемо видалити зображення: в області ніжки та навколо
Маска капелюшка=(0000000000001111110001111111100111111110011111111001111111100000000000000000000000000000000000000000)\text{Маска капелюшка} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Поелементне множення (операція Адамара):

Капелюшок=ГрибМаска\text{Капелюшок} = \text{Гриб} \odot \text{Маска}

Візуалізація виділеного капелюшка:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛

Результат – тільки капелюшок гриба, решта пікселів чорні!

Альтернативний підхід – через віднімання:

Якби у нас була окрема матриця ніжки гриба, ми могли б отримати той самий результат через віднімання:

Капелюшок=ГрибНіжка\text{Капелюшок} = \text{Гриб} - \text{Ніжка}

Де матриця ніжки містить значення тільки в нижній частині (рядки 7-10). Це показує, що в обробці зображень часто існує кілька способів досягти одного результату!

Обертання на 90 градусів 🔄

Для обертання на 90° за годинниковою стрілкою:

  1. Транспонуємо матрицю (міняємо рядки і стовпці)
  2. Відзеркалюємо кожен рядок (реверсуємо порядок елементів у кожному рядку)

Крок 1 - Транспонування:

При транспонуванні рядки стають стовпцями:

ГрибT=(0000000000001221000001233200000233131110023133222102313322210233131110012332000000122100000000000000)\text{Гриб}^T = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 2 & 3 & 3 & 2 & 0 & 0 & 0 & 0 \\ 0 & 2 & 3 & 3 & 1 & 3 & 1 & 1 & 1 & 0 \\ 0 & 2 & 3 & 1 & 3 & 3 & 2 & 2 & 2 & 1 \\ 0 & 2 & 3 & 1 & 3 & 3 & 2 & 2 & 2 & 1 \\ 0 & 2 & 3 & 3 & 1 & 3 & 1 & 1 & 1 & 0 \\ 0 & 1 & 2 & 3 & 3 & 2 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Крок 2 - Реверс кожного рядка:

Тепер змінюємо порядок елементів у кожному рядку:

Гриб90°=(0000000000000012210000002332100111313320122233132012223313200111313320000023321000001221000000000000)\text{Гриб}_{90°} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 2 & 3 & 3 & 2 & 1 & 0 \\ 0 & 1 & 1 & 1 & 3 & 1 & 3 & 3 & 2 & 0 \\ 1 & 2 & 2 & 2 & 3 & 3 & 1 & 3 & 2 & 0 \\ 1 & 2 & 2 & 2 & 3 & 3 & 1 & 3 & 2 & 0 \\ 0 & 1 & 1 & 1 & 3 & 1 & 3 & 3 & 2 & 0 \\ 0 & 0 & 0 & 0 & 2 & 3 & 3 & 2 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 & 2 & 2 & 1 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \end{pmatrix}

Візуалізація поверненого на 90° гриба:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛🔲🔳🔳🔲⬛⬛
⬛⬛⬛⬛🔳⬜⬜🔳🔲⬛
⬛🔲🔲🔲⬜🔲⬜⬜🔳⬛
🔲🔳🔳🔳⬜⬜🔲⬜🔳⬛
🔲🔳🔳🔳⬜⬜🔲⬜🔳⬛
⬛🔲🔲🔲⬜🔲⬜⬜🔳⬛
⬛⬛⬛⬛🔳⬜⬜🔳🔲⬛
⬛⬛⬛⬛🔲🔳🔳🔲⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛

Тепер наш гриб повернувся на 90° за годинниковою стрілкою – ніжка вказує вліво, а капелюшок вправо!

Зміна яскравості та контрасту 🔆

Збільшення яскравості:

Яскравий=min(3,Гриб+1)\text{Яскравий} = \min(3, \text{Гриб} + 1)

Додаємо 1 до кожного пікселя (але не більше максимуму 3).

Візуалізація яскравішого гриба:

🔲🔲🔲🔲🔲🔲🔲🔲🔲🔲
🔲🔲🔳⬜⬜⬜⬜🔳🔲🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲⬜⬜⬜🔳🔳⬜⬜⬜🔲
🔲⬜⬜🔳⬜⬜🔳⬜⬜🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔲🔳🔳🔲🔲🔲🔲

Збільшення контрасту:

Контрастний=round(1.5×(Гриб1.5)+1.5)\text{Контрастний} = \text{round}(1.5 \times (\text{Гриб} - 1.5) + 1.5)

Як це працює:

  1. Чому 1.5? Це середина нашого діапазону кольорів (0-3). Середнє = (0+3)/2 = 1.5
  2. (Гриб1.5)(\text{Гриб} - 1.5) – відхилення від середини:
    • Якщо піксель = 0 (чорний): 01.5=1.50 - 1.5 = -1.5
    • Якщо піксель = 3 (білий): 31.5=+1.53 - 1.5 = +1.5
  3. ×1.5\times 1.5 – збільшуємо відхилення (коефіцієнт контрасту)
  4. +1.5+ 1.5 – повертаємо до початкового діапазону
  5. round()\text{round}() – округлення до найближчого цілого числа (0.510.5 \rightarrow 1, 1.411.4 \rightarrow 1, 1.621.6 \rightarrow 2)

Приклади:

  • Піксель = 0: round(1.5×(01.5)+1.5)=round(2.25+1.5)=round(0.75)=0\text{round}(1.5 \times (0 - 1.5) + 1.5) = \text{round}(-2.25 + 1.5) = \text{round}(-0.75) = 0
  • Піксель = 1: round(1.5×(11.5)+1.5)=round(0.75+1.5)=round(0.75)=1\text{round}(1.5 \times (1 - 1.5) + 1.5) = \text{round}(-0.75 + 1.5) = \text{round}(0.75) = 1
  • Піксель = 2: round(1.5×(21.5)+1.5)=round(0.75+1.5)=round(2.25)=2\text{round}(1.5 \times (2 - 1.5) + 1.5) = \text{round}(0.75 + 1.5) = \text{round}(2.25) = 2
  • Піксель = 3: round(1.5×(31.5)+1.5)=round(2.25+1.5)=round(3.75)=3\text{round}(1.5 \times (3 - 1.5) + 1.5) = \text{round}(2.25 + 1.5) = \text{round}(3.75) = 3 (обмежуємо максимумом)

Це розтягує значення від середнього, роблячи темні пікселі темнішими, а світлі – світлішими.

Візуалізація контрастного гриба:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬜⬜⬜⬜⬛⬛⬛
⬛⬛⬜⬜⬜⬜⬜⬜⬛⬛
⬛⬜⬜⬜⬛⬛⬜⬜⬜⬛
⬛⬜⬜⬛⬜⬜⬛⬜⬜⬛
⬛⬛⬜⬜⬜⬜⬜⬜⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛

Композиція зображень – додавання елементів 🎨

Уявімо, що ми хочемо додати траву під грибом:

Як створюємо матрицю трави:

  1. Верхні 7 рядків = 0: тут немає трави, це небо та простір для гриба
  2. Рядок 8: рідкі травинки (1 0 1 0 0 0 0 1 0 1) - окремі стебла
  3. Рядок 9: густіша трава (1 1 1 1 0 0 1 1 1 1) - більше покриття, але є проміжки
  4. Рядок 10: земля (2 2 2 2 2 2 2 2 2 2) - суцільний шар світло-сірого кольору
Трава=(0000000000000000000000000000000000000000000000000000000000000000000000101000010111110011112222222222)\text{Трава} = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 & 1 \\ 1 & 1 & 1 & 1 & 0 & 0 & 1 & 1 & 1 & 1 \\ 2 & 2 & 2 & 2 & 2 & 2 & 2 & 2 & 2 & 2 \end{pmatrix}

Об’єднання:

Сцена=max(Гриб,Трава)\text{Сцена} = \max(\text{Гриб}, \text{Трава})

Функція max бере більше значення для кожного пікселя, щоб трава не “затерла” гриб.

Візуалізація гриба з травою:

⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
🔲⬛🔲🔲🔳🔳🔲🔲⬛🔲
🔲🔲🔲🔲🔳🔳🔲🔲🔲🔲
🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳

Фільтри розмиття – згладжування 🌫️

Фільтрація – це процес обробки зображення за допомогою невеликої матриці (ядра), яка “ковзає” по всьому зображенню.

Фільтр усереднення (Box blur):

Фільтр=19(111111111)\text{Фільтр} = \frac{1}{9} \begin{pmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{pmatrix}

Як працює фільтрація:

Приклад для пікселя в позиції (3,4) нашого гриба:

  1. Вибираємо область 3×3 навколо пікселя:

    2 3 3    (значення з матриці гриба)
    3 1 1    центр = позиція (3,4), значення = 1
    3 3 3
  2. Поелементно множимо на фільтр:

    2×(1/9) + 3×(1/9) + 3×(1/9) +
    3×(1/9) + 1×(1/9) + 1×(1/9) +
    3×(1/9) + 3×(1/9) + 3×(1/9)
  3. Сумуємо результати:

    = (2+3+3+3+1+1+3+3+3) / 9
    = 22 / 9
    = 2.44 ≈ 2 (округлюємо)
  4. Новий піксель = 2 (світло-сірий замість темно-сірого)

Було: 🔲 (темно-сірий, значення 1) Стало: 🔳 (світло-сірий, значення 2)

Піксель став світлішим, бо навколо нього більше світлих пікселів!

Чому це працює:

  • Усереднення: кожен піксель стає середнім арифметичним своїх сусідів
  • Згладжування: різкі переходи між кольорами стають плавнішими
  • Видалення шуму: випадкові яскраві/темні пікселі зникають

Інші популярні фільтри:

  • Гаусове розмиття: більша вага центральному пікселю
  • Виявлення країв: від’ємні значення для контрасту
  • Підвищення різкості: підсилення центрального пікселя

Візуалізація розмитого гриба (приблизно):

⬛⬛🔲🔲🔲🔲🔲🔲⬛⬛
⬛🔲🔲🔳🔳🔳🔳🔲🔲⬛
🔲🔲🔳🔳🔳🔳🔳🔳🔲🔲
🔲🔳🔳🔳🔳🔳🔳🔳🔳🔲
🔲🔳🔳🔳🔳🔳🔳🔳🔳🔲
🔲🔲🔳🔳🔳🔳🔳🔳🔲🔲
⬛🔲🔲🔳🔳🔳🔳🔲🔲⬛
⬛⬛🔲🔲🔳🔳🔲🔲⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛

Контури стали м’якшими, деталі змазалися.

Практичне застосування в ШІ 🤖

Хоча наш гриб простий, ці самі операції використовуються для:

  1. Аугментація даних: Обертання, відзеркалення зображень для навчання нейромереж
  2. Попередня обробка: Нормалізація яскравості та контрасту
  3. Виявлення об’єктів: Використання масок для виділення регіонів інтересу
  4. Фільтрація: Видалення шуму, виявлення країв
  5. Стиснення: Зменшення розміру даних без втрати важливої інформації

Експерименти для закріплення 🧪

  1. Спробуйте намалювати свій простий об’єкт матрицею (будиночок, дерево, смайлик)
  2. Застосуйте різні трансформації і подивіться на результат
  3. Комбінуйте операції: що буде, якщо спочатку інвертувати кольори, а потім обернути?
  4. Створіть анімацію: послідовно обертайте зображення на 90°, 180°, 270°

Підсумок 🎯

Матричні перетворення – це основа обробки зображень:

  • Прості операції (додавання, множення) дають складні ефекти
  • Композиція трансформацій створює нові можливості
  • Маски та фільтри дозволяють працювати з частинами даних
  • Все це масштабується – від 10×10 до мільйонів пікселів!

Ключові ідеї:

  1. Зображення = матриця чисел
  2. Трансформація = матрична операція
  3. Композиція = послідовність операцій
  4. Ефективність = паралельні обчислення