Матричні перетворення - малюємо гриб
Кафедра ШІзики
Автор
15 хвилин
Час читання
24.07.2025
Дата публікації
Лекція 3: Матричні перетворення – Магія трансформації даних 🎨
У попередніх лекціях ми дізналися, що матриці можуть зберігати дані та виконувати над ними операції. Але справжня магія починається, коли ми використовуємо матриці для перетворення даних. Сьогодні ми намалюємо гриб числами і навчимося його трансформувати!
Усі приклади в цій лекції спрощені для кращого розуміння концепцій. Реальні алгоритми обробки зображень можуть бути складнішими. Матриця 10×10 використовується лише для наочності – справжні зображення мають сотні або тисячі пікселів у кожному вимірі. Візуалізації та розрахунки можуть бути наближеними для збереження простоти пояснення.
Малюємо гриб матрицею 🍄
Уявімо, що в нас є зображення гриба. Зображення це фактично матриця пікселів, де кожен з них має свої певні характеристики, в нашому випадку зупинимось на кольорі.
Отже, нехай ми маємо наступну палітру кольорів:
- 0 = чорний (⬛)
- 1 = темно-сірий (🔲)
- 2 = світло-сірий (🔳)
- 3 = білий (⬜)
А отже, наш гриб у вигляді матриці 10×10 і за нашою палітрою буде виглядати ось так:
Візуалізація:
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛
Розпізнавання образів – як ШІ “бачить” гриб? 👁️
Перш ніж трансформувати зображення, давайте зрозуміємо, як комп’ютер взагалі розпізнає, що на картинці є гриб. Це основа комп’ютерного зору!
Еталонний гриб (те, що ми шукаємо):
Наше зображення (трохи інший гриб):
Візуалізації для порівняння:
Еталон:
⬛🔲🔳🔳⬜⬜🔳🔳🔲⬛
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲⬜⬜🔳🔲🔲🔳⬜⬜🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
⬛🔲🔳🔳🔳🔳🔳🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
Наш гриб:
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛
Як порівняти? Обчислюємо різницю:
Де |…| означає абсолютне значення кожного елемента.
Результат:
Візуалізація різниці (чим світліше, тим більша різниця):
⬛🔲🔲⬛🔲🔲⬛🔲🔲⬛
🔲🔲🔲⬛⬛⬛⬛🔲🔲🔲
🔲🔲⬛⬛⬛⬛🔲⬛🔲🔲
🔲⬛⬛🔳⬛⬛🔳⬛⬛🔲
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
Оцінка схожості:
Крок 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: Переводимо в відсоток схожості
ШІ вважає зображення грибом, якщо схожість > 85%
Де найбільші відмінності?
Дивлячись на матрицю різниць, бачимо:
- Капелюшок ширший в еталоні (верхній рядок)
- Плямки на капелюшку розташовані по-різному (значення 2 в рядку 5)
- Ніжка коротша в нашому грибі (різниця в останньому рядку)
Саме так працюють алгоритми розпізнавання образів – порівнюють матриці пікселів!
Інверсія кольорів – негатив зображення 🔄
Щоб створити негатив, віднімаємо кожне значення від максимального (3):
Операція поелементно:
- Чорний (0) → Білий (3)
- Темно-сірий (1) → Світло-сірий (2)
- Світло-сірий (2) → Темно-сірий (1)
- Білий (3) → Чорний (0)
Візуалізація негативу:
⬜⬜🔳🔲🔲🔲🔲🔳⬜⬜
⬜🔳🔲⬛⬛⬛⬛🔲🔳⬜
⬜🔲⬛⬛🔳🔳⬛⬛🔲⬜
⬜🔲⬛🔳⬛⬛🔳⬛🔲⬜
⬜🔳🔲⬛⬛⬛⬛🔲🔳⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜🔳🔲🔲🔳⬜⬜⬜
⬜⬜⬜⬜🔳🔳⬜⬜⬜⬜
Тепер наш гриб світиться на темному фоні! ✨
Горизонтальне відзеркалення 🪞
Для відзеркалення по горизонталі просто переставляємо стовпці в зворотному порядку:
Де P – матриця перестановки для відзеркалення:
Візуалізація відзеркаленого гриба:
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
⬛⬛⬛⬛🔲🔲⬛⬛⬛⬛
гриб дивиться в інший бік! (Хоча в цьому випадку він симетричний)
Виділення частин зображення – маска 🎭
Хочемо виділити тільки капелюшок гриба? Створюємо матрицю-маску:
Як будуємо маску:
- Визначаємо область капелюшка: дивимось на оригінальний гриб і бачимо, що капелюшок займає рядки 1-6
- Ставимо 1 там, де хочемо зберегти зображення: в області капелюшка
- Ставимо 0 там, де хочемо видалити зображення: в області ніжки та навколо
Поелементне множення (операція Адамара):
Візуалізація виділеного капелюшка:
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
Результат – тільки капелюшок гриба, решта пікселів чорні!
Альтернативний підхід – через віднімання:
Якби у нас була окрема матриця ніжки гриба, ми могли б отримати той самий результат через віднімання:
Де матриця ніжки містить значення тільки в нижній частині (рядки 7-10). Це показує, що в обробці зображень часто існує кілька способів досягти одного результату!
Обертання на 90 градусів 🔄
Для обертання на 90° за годинниковою стрілкою:
- Транспонуємо матрицю (міняємо рядки і стовпці)
- Відзеркалюємо кожен рядок (реверсуємо порядок елементів у кожному рядку)
Крок 1 - Транспонування:
При транспонуванні рядки стають стовпцями:
Крок 2 - Реверс кожного рядка:
Тепер змінюємо порядок елементів у кожному рядку:
Візуалізація поверненого на 90° гриба:
⬛⬛⬛⬛🔲🔳🔳🔲⬛⬛
⬛⬛⬛⬛🔳⬜⬜🔳🔲⬛
⬛🔲🔲🔲⬜🔲⬜⬜🔳⬛
🔲🔳🔳🔳⬜⬜🔲⬜🔳⬛
🔲🔳🔳🔳⬜⬜🔲⬜🔳⬛
⬛🔲🔲🔲⬜🔲⬜⬜🔳⬛
⬛⬛⬛⬛🔳⬜⬜🔳🔲⬛
⬛⬛⬛⬛🔲🔳🔳🔲⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
Тепер наш гриб повернувся на 90° за годинниковою стрілкою – ніжка вказує вліво, а капелюшок вправо!
Зміна яскравості та контрасту 🔆
Збільшення яскравості:
Додаємо 1 до кожного пікселя (але не більше максимуму 3).
Візуалізація яскравішого гриба:
🔲🔲🔳⬜⬜⬜⬜🔳🔲🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲⬜⬜⬜🔳🔳⬜⬜⬜🔲
🔲⬜⬜🔳⬜⬜🔳⬜⬜🔲
🔲🔳⬜⬜⬜⬜⬜⬜🔳🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔳⬜⬜🔳🔲🔲🔲
🔲🔲🔲🔲🔳🔳🔲🔲🔲🔲
Збільшення контрасту:
Як це працює:
- Чому 1.5? Це середина нашого діапазону кольорів (0-3). Середнє = (0+3)/2 = 1.5
- – відхилення від середини:
- Якщо піксель = 0 (чорний):
- Якщо піксель = 3 (білий):
- – збільшуємо відхилення (коефіцієнт контрасту)
- – повертаємо до початкового діапазону
- – округлення до найближчого цілого числа (, , )
Приклади:
- Піксель = 0:
- Піксель = 1:
- Піксель = 2:
- Піксель = 3: (обмежуємо максимумом)
Це розтягує значення від середнього, роблячи темні пікселі темнішими, а світлі – світлішими.
Візуалізація контрастного гриба:
⬛⬛⬛⬜⬜⬜⬜⬛⬛⬛
⬛⬛⬜⬜⬜⬜⬜⬜⬛⬛
⬛⬜⬜⬜⬛⬛⬜⬜⬜⬛
⬛⬜⬜⬛⬜⬜⬛⬜⬜⬛
⬛⬛⬜⬜⬜⬜⬜⬜⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬜⬜⬛⬛⬛⬛
⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛
Композиція зображень – додавання елементів 🎨
Уявімо, що ми хочемо додати траву під грибом:
Як створюємо матрицю трави:
- Верхні 7 рядків = 0: тут немає трави, це небо та простір для гриба
- Рядок 8: рідкі травинки (1 0 1 0 0 0 0 1 0 1) - окремі стебла
- Рядок 9: густіша трава (1 1 1 1 0 0 1 1 1 1) - більше покриття, але є проміжки
- Рядок 10: земля (2 2 2 2 2 2 2 2 2 2) - суцільний шар світло-сірого кольору
Об’єднання:
Функція max
бере більше значення для кожного пікселя, щоб трава не “затерла” гриб.
Візуалізація гриба з травою:
⬛⬛🔲🔳🔳🔳🔳🔲⬛⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛🔳⬜⬜🔲🔲⬜⬜🔳⬛
⬛🔳⬜🔲⬜⬜🔲⬜🔳⬛
⬛🔲🔳⬜⬜⬜⬜🔳🔲⬛
⬛⬛⬛🔲🔳🔳🔲⬛⬛⬛
🔲⬛🔲🔲🔳🔳🔲🔲⬛🔲
🔲🔲🔲🔲🔳🔳🔲🔲🔲🔲
🔳🔳🔳🔳🔳🔳🔳🔳🔳🔳
Фільтри розмиття – згладжування 🌫️
Фільтрація – це процес обробки зображення за допомогою невеликої матриці (ядра), яка “ковзає” по всьому зображенню.
Фільтр усереднення (Box blur):
Як працює фільтрація:
Приклад для пікселя в позиції (3,4) нашого гриба:
-
Вибираємо область 3×3 навколо пікселя:
2 3 3 (значення з матриці гриба) 3 1 1 центр = позиція (3,4), значення = 1 3 3 3
-
Поелементно множимо на фільтр:
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)
-
Сумуємо результати:
= (2+3+3+3+1+1+3+3+3) / 9 = 22 / 9 = 2.44 ≈ 2 (округлюємо)
-
Новий піксель = 2 (світло-сірий замість темно-сірого)
Було: 🔲 (темно-сірий, значення 1) Стало: 🔳 (світло-сірий, значення 2)
Піксель став світлішим, бо навколо нього більше світлих пікселів!
Чому це працює:
- Усереднення: кожен піксель стає середнім арифметичним своїх сусідів
- Згладжування: різкі переходи між кольорами стають плавнішими
- Видалення шуму: випадкові яскраві/темні пікселі зникають
Інші популярні фільтри:
- Гаусове розмиття: більша вага центральному пікселю
- Виявлення країв: від’ємні значення для контрасту
- Підвищення різкості: підсилення центрального пікселя
Візуалізація розмитого гриба (приблизно):
⬛🔲🔲🔳🔳🔳🔳🔲🔲⬛
🔲🔲🔳🔳🔳🔳🔳🔳🔲🔲
🔲🔳🔳🔳🔳🔳🔳🔳🔳🔲
🔲🔳🔳🔳🔳🔳🔳🔳🔳🔲
🔲🔲🔳🔳🔳🔳🔳🔳🔲🔲
⬛🔲🔲🔳🔳🔳🔳🔲🔲⬛
⬛⬛🔲🔲🔳🔳🔲🔲⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
⬛⬛⬛🔲🔲🔲🔲⬛⬛⬛
Контури стали м’якшими, деталі змазалися.
Практичне застосування в ШІ 🤖
Хоча наш гриб простий, ці самі операції використовуються для:
- Аугментація даних: Обертання, відзеркалення зображень для навчання нейромереж
- Попередня обробка: Нормалізація яскравості та контрасту
- Виявлення об’єктів: Використання масок для виділення регіонів інтересу
- Фільтрація: Видалення шуму, виявлення країв
- Стиснення: Зменшення розміру даних без втрати важливої інформації
Експерименти для закріплення 🧪
- Спробуйте намалювати свій простий об’єкт матрицею (будиночок, дерево, смайлик)
- Застосуйте різні трансформації і подивіться на результат
- Комбінуйте операції: що буде, якщо спочатку інвертувати кольори, а потім обернути?
- Створіть анімацію: послідовно обертайте зображення на 90°, 180°, 270°
Підсумок 🎯
Матричні перетворення – це основа обробки зображень:
- ✅ Прості операції (додавання, множення) дають складні ефекти
- ✅ Композиція трансформацій створює нові можливості
- ✅ Маски та фільтри дозволяють працювати з частинами даних
- ✅ Все це масштабується – від 10×10 до мільйонів пікселів!
Ключові ідеї:
- Зображення = матриця чисел
- Трансформація = матрична операція
- Композиція = послідовність операцій
- Ефективність = паралельні обчислення