Зберігання та обробка растрових

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 30

Зберігання та обробка растрових зображень

5. Растрові зображення і їх характеристики


Зображення розбивається на безліч дрібних, неподільних і не перетинаються один з одним
фрагментів - пікселів. При цьому кожна точка початкового зображення завжди потрапляє в деякий
з отриманих фрагментів. Колір кожного пікселя задається незалежно від інших.
Основні параметри растрового зображення:
● логічний розмір (Наприклад, 1000х1000 пікселів)
● фізичний розмір (Наприклад, розміри монітора)
● Дозвіл (Щільність) - пов'язує логічний і фізичний розміри
○ Чи знаєте ви?
■ Людський зір розрізняє точки з точністю до однієї хвилини (1/60 градуса)
■ Для відстані в 50 см це відповідає дозволу 181 175 dpi
■ А для 30 см - 192 291 dpi
● Форма, крок, розмір пікселя
● геометрія растра
○ Форма пікселя (буває прямокутна (НЕ
квадратна) та кругла)
○ Взаємне розташування пікселів
● глибина кольору - визначається числом біт, відводяться для зберігання кольору пікселя
● Наявність α-каналу (Прозорість)

Переваги растрової графіки:


● універсальність
● Всі пристрої введення і багато пристроїв виведення - растрові
● Швидкість обробки зображення не залежить від самого зображення
● Можливість паралельної обробки
недоліки:
● Великі обсяги пам'яті і ресурсомісткість
● Неможливість точного масштабування і повороту
● Неможливість висновок на плоттер (графічний пристрій)

6. Основні підходи до кодування кольору і зберігання растрових


зображень

Завдання зберігання растрових зображень зводиться до задачі зберігання положення пікселя і


його кольору.

Способи зберігання кольору:


● Безпосереднє кодування (наприклад, RGB24 (24 біт, по байту на колір), RGBA32)
○ переваги:
■ надійність
■ незалежність зберігання
○ недоліки:
■ велика витрата пам'яті
● Використання палітри (набір кольорів - палітра - зберігається окремо, а в пікселях тільки
посилання на кольори з палітри). Зазвичай містить 2n квітів.
1
○ види палітр
■ апаратні (незмінні, задані на рівні пристрою)
■ програмні
○ переваги
■ економічна витрата пам'яті
○ недоліки
■ обмежений набір кольорів: прийнятно для перегляду / зберігання, але
незручно при редагуванні. При зміні кількості квітів треба перелопатити всю
палітру.
○ приклади:
■ CGA (чотири деяких кольору)
■ EGA (16 кольорів)
■ VGA (256 кольорів)
■ SVGA (16 млн.)
Способи зберігання зображення:
● без стиснення (У вигляді двовимірного масиву пікселів)
○ переваги:
■ простота
○ недоліки:
■ Велика витрата пам'яті
● Стиснення без втрат
○ види
■ З використанням специфіки зображення
■ Без використання специфіки
○ алгоритми
■ RLE (Run-length encoding) - зберігає значення і число повторів
Наприклад, нехай дана рядок:
WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWW
WWWWWWWWWWWW
Якщо ми застосуємо просте кодування довжин серій, то отримаємо наступне:
12W1B12W3B24W1B14W

Однак, в разі, якщо рядок складається з великої кількості неповторюваних


символів, її обсяг може зрости. Наприклад, рядок
ABCABCABCABCDDEFFFFFFFF
закодується як
1A1B1C1A1B1C1A1B1C1A1B1C2D1E8F
Проблема вирішується досить просто. Позитивні числа використовують для
запису кількості повторюваних однакових символів, а негативні - для запису
кількості неоднакових:
-12ABCABCABCABC2D1E8F

Якщо кодувати також повтор груп символів, то можна стиснути рядок ще


більше:
4 [ABC] 1C2D1E8F

Ще одна проблема пов'язана з тим, що чисельні типи даних на комп'ютері


завжди мають певний межа. Припустимо, ми використовуємо signed char для
запису довжин серій. Тоді ми не можемо записати серію довше 127 символів
однією парою "довжина-символ". Якщо поспіль записано 256 символів "A", їх
поділяють на мінімальну кількість груп:

2
127A127A2A
Запис на деякій мові програмування алгоритму RLE з урахуванням цих
обмежень нетривіальна.
■ Методи ентропійному компресії:
● LZW - zip-алгоритми
● Метод Хаффмана (спочатку збирає статистику по зображенню)
Кожній послідовності пікселів ставиться у відповідність бітова послідовність,
довжина якої обернено пропорційна частоті появи кольору / групи пікселів в
зображенні: чим частіше зустрічається елемент, тим коротше його код, і
навпаки. (Ми зчитуємо послідовно символи вхідного потоку і перевіряємо, чи
є у створеній нами таблиці рядків такий рядок. Якщо рядок є, то ми зчитуємо
наступний символ, а якщо рядки немає, то заносимо в потік код для
попередньої знайденої рядки, заносимо рядок в таблицю і починаємо пошук
знову. LZW реалізований в форматах GIF і TIFF.)
○ переваги
■ Економічна витрата пам'яті
■ Збереження точної інформації
○ недоліки
■ Складний доступ до даних
■ При зміні зображення може не вистачити пам'яті (?)
■ Неможливість регулювання ступеня стиснення
● Стиснення з втратами- відбуваються незначні зміни, непомітні людині. Всі алгоритми
цього класу використовують особливості людського зору. Однак існує поріг, після якого
зображення помітно втрачає якість.
○ переваги
■ Економічне витрачання пам'яті
■ Можливість регулювання ступеня стиснення
○ недоліки
■ Складний доступ до даних

Основні формати
● bmp
○ Використовує кілька способів зберігання кольору
○ Підтримує α-канал
○ Підтримує стиснення без втрат
○ підтримує палітри
● tiff
○ Більша глибина кольору
○ Підтримує кілька колірних моделей
○ Підтримує декілька методів колірної компресії (спочатку формат підтримував
стиснення без втрат, згодом формат був доповнений для підтримки стиснення з
втратами в форматі JPEG)
○ підтримує теги
● gif (Graphics interchange format)
○ Стиснення без втрат
○ Однобітний α-канал (без напівпрозорої)
○ Підтримує тільки 256-кольорову палітру
○ підтримує анімацію
○ Підтримує чересстрочную розгортку - дозволяє побачити картинку до повного
завантаження, яка проходить в чотири етапи:

3

○ Можна створювати GIF-зображення тільки за допомогою ліцензійного ПЗ Термін дії
останнього патенту на GIF закінчився 11 серпня 2006 року (с) ВП
● png (Portable network graphics)
○ Стиснення без втрат
○ Підтримує двовимірну і 4-х-рядкову розгортку
○ підтримує палітри
○ підтримує анімацію
○ підтримує теги
● jpeg
○ використовує для стиснення дискретно-косинусное перетворення (ДКП)
■ JPEG-LS - стиснення без втрат
■ JPEG-2000 - стиснення на основі вейвлетів
■ Стиснення з втратами
○ Добре підходить для фото, гірше для малюнків
○ Може зберігати службову інформацію (теги, інформацію про фотоапарат, умовах
зйомки і т.п.)

7. Стиснення зображень на основі ДКП (алгоритм JPEG)


Людина легше розрізняє яскравість, ніж колір. Цю особливість використовує колірна модель
YCbCr (Y - яскравість, Cb - хроматичний синій, Cr - хроматичний червоний): при перекладі в неї з
RGB інформація про яскравість зберігається, а про колір - частково втрачається. YCbCr
застосовується в телебаченні.

ДКП - дискретно-косинусное перетворення, використовується для стиснення зображень.


алгоритм:
1 Перетворення RGB → YCbCr: YCbCr = Т * RGB; Т - матриця коефіцієнтів 3х3.
2 Зображення розбивається на фрагметов 8х8 px, які обробляються окремо. Створюється
матриця DKL = cos (K (L + 0.5) π / N), 0≤K, L <N, N = 8. Кожен фрагмент розкладається в
лінійну комбінацію таких матриць Верхній лівий коефіцієнт - найбільший, тому має
найбільший вплив на результат. AK, L - підбираємо.Y = ∑7K,L=0 aK,L D
3 Квантування. Матриця квантування QK, L постійна і задається на рівні формату. Елементи
матриці коефіцієнтів А целочисленном діляться на відповідні значення Q, багато хто з них
обнуляються, звідси втрати. На цьому етапі можливе регулювання ступеня стиснення
(наприклад, якщо в якості матриці QK, L взяти одиничну, втрат не буде, тому що при
целочисленном розподілі будь-якого числа на 1 втрати неможливі, на відміну від 9/10).
4 Отримана матриця коефіцієнтів AK, L (після ділення вона записана уздовж неголовних
діагоналі "змійкою") стискається методом ентропійному компресії без втрат.

При декомпресії дії виконуються в зворотному порядку.

4
8. Фрактальное стиснення зображень. алгоритм Малла
алгоритм Малла- різновид дискретного вейвлет-перетворення.
Застосовується для попередньої обробки сигналу з метою зменшення
його інформаційної надмірності:
1 Вхідний набір даних розбивається на пари
2 Для кожної пари знаходиться різниця і сума
○ Різниця - ВЧ-фільтр (фіксує дрібні деталі)
○ Сума - НЧ-фільтр (фіксує великі зміни)
3 Алгоритм застосовується рекурсивно до масиву сум, а масив
різниць записується в результат.
Після виконання перетворення отриманий сигнал добре стискається
методом ентропійному компресії. Перетворення двовимірного сигналу
(наприклад, зображення) проводиться аналогічно.

Фрактальное стиснення. У промисловості не застосовується. Усе.


У просторі зображень {x} вводиться метрика ρ (x, y) схожості; наприклад, евклидова:

ρ=∑ (xij − yij )2

і деякий стискуюче відображення


A: X → Y
∀x, y: ρ(A(x), A(y)) ≤ c ⋅ ρ(x, y)
c ∈ (0, 1)
По теоремі Банаха, відображення, застосоване до вихідного зображення, дасть те ж саме
зображення:
A (x) = x,
тому після багаторазового застосування відображення A будь-яке зображення "зійдеться" до
вихідного. В процесі фрактального стиснення для поданого на вхід зображення будується
стискуюче відображення. Воно кодується і записується в файл. При відкритті відображення
завантажується з цього файлу і застосовується n раз до чорної зображенні.
Основне завдання - як по безлічі X визначити відображення A. Цього поки ніхто не знає.

9. Стиснення зображень без втрат (алгоритм JPEG-LS)


Алгоритм намагається передбачити колір пікселя за кольорами його сусідів, використовуючи один
з чотирьох способів:
● C [x, y] = C [x-1, y] // сусід зліва
● C [x, y] = C [x, y-1] // сусід зверху
● C [x, y] = C [x-1, y-1] // сусід зліва-зверху
● C [x, y] = 0.5 * (C [x-1, y] + C [x, y-1]) // середнє між сусідами зліва і зверху

Замість кольору пікселя зберігаємо номер методу передбачення (вибираємо найбільш точний) і
величину помилки. Якщо на зображенні мало деталей, то помилки також будуть малі. Після цього
можна:
● округлити похибки - отримаємо стиснення з втратами
● стиснути отриману послідовності as is - тоді втрат не буде

10. Формат цифрової фотографії (RAW)


Світлочутлива матриця складається з датчиків, які визначають, скільки світла потрапило в точку.
Основні терміни:

5
● діафрагма - ширина відкриття датчика
● витримка - час відкриття датчика
● експозиційна пара - сукупність діафрагми і витримки
● недоекспозиція - недолік світла
● переекспозиції - надлишок світла
Датчики як такі визначають тільки яскравість. Для визначення кольору перед ними ставляться
фільтри: один пропускає тільки зелене світло, інший - червоний і т.д.
Розташування датчиків (матриця Байєра):
Людина краще сприймає зелений, тому таких датчиків більше. Формат RAW
зберігає показники датчиків.
Колір білих тіл залежить від того, яке джерело їх висвітлює. Для правильної
передачі кольорів необхідно задавати колір джерела освітлення, а то будуть сині
особи. і червоні носи
Баланс білогозалежить від джерела освітлення, задається через колірну
температуру - це температура абсолютно чорного тіла, яке випромінює стільки світла. Якщо
нагріти абсолютно чорне тіло, то воно буде світитися, а якщо немає - то поглинати все промені.
Від температури залежить, якого кольору буде випромінювання. Примітно, що одним з найбільш
близьких до абсолютно чорного тіла об'єктів є Сонце.

Перетворення RAW в растровий формат:


1 Дебайерізація. Показання датчиків кожного кольору підсумовуються Дві схеми:
a Використовуються чотири верхніх лівих датчика, в результаті - піксель між ними.
b Використовуються всі 16 датчиків, в результаті - дев'ять пікселів, розташованих між
ними.
На цьому кроці враховується експокоррекция і баланс білого.
2 Облік логарифмічність відчуття інтенсивності світла (наприклад, якщо інтенсивність зростає
вчетверо, то людина відчуває це як подвоєння - невірно!): Відмінність темних тонів
відчувається краще, ніж світлих. Оскільки в RGB ця логарифмічність не закладена,
128≈200. 128 - середній колір на видачу монітора, 200 - середній колір при фотографуванні
3 Підвищення цветонасищенності і різкості (RGB → HSB і S + = 10%)
4 Збереження в * .jpg
Переваги RAW:
● Великий колірний обхват і великий динамічний діапазон (різниця між самою темною і
найяснішої точками; в RGB тільки 256)
● Велика точність передачі кольорів
● Можливість коригування балансу білого
● Висока різкість зображення
● Можливість обробки в RAW-конвертері
● Можливість багаторазової обробки
Недоліки RAW:
● Відсутність єдиного стандарту (формати RAW різних виробників несумісні)
● Чи не є підсумковим зображенням, вимагає переробки
● Вимагає багато пам'яті

11. Пониження шумів зображень


Шуми виникають через збій датчиків, відхилення кольору пікселя. Фільтрація дозволяє придушити
шуми, але при цьому зникають і деталі.
Види шумів:
● яскравості
● колірні

6
Параметри шумів:
● амплітуда - величина відхилення сигналу від вірного значення.
● частота - показує, як часто з'являється шум у сигналі.
Методи придушення шумів:
● згладжування (Фільтрація по Гауса):
○ f(x, y) = ∑+N
i,j=−N g(x + i, y + j)M i+N,j+N

○ - матриця фільтрації розміру (2n +1) * (2n +1) показує вагу пікселя
поряд з x, y
g - вихідна інтенсивність
● Медіанна шумова фільтрація. Кольори сусідніх пікселів поміщаються в одновимірний
масив, упорядковано і вибирається середній (по положенню в списку).
○ Гідність: піксель приймає інтенсивність, яка реально присутній в його оточенні.
○ Недолік: дуже низька швидкість
● метод ДКП. При стисненні разом з деталями зникають і шуми.
● метод усереднення. Беремо кілька зображень; один і той же піксель на всіх зображеннях
буде відповідати одному і тому ж об'єкту, знаходимо середнє.

12. Інтерполяція растрових зображень (масштабування, поворот, вигин)


Інтерполяція растрових зображень потрібно при зміні геометрії
растра:
● масштабування
● поворот, згин
● коригування проблем зйомки (кривої фотік, крива
фотка, кривої горизонт, криві руки і т.п.)
Інтерполяція дозволяє визначити колір пікселя на його околиці.
Алгоритми інтерполяції:
● неадаптивні. Ніяк не враховують кордону (контури) в оригінальному документі. Способи
визначення кольору:
1 найближчий піксель (Nearest-neighbor)
2 білінійну: Обчислюється середнє серед 4-х сусідніх пікселів (Не зовсім так:
створюємо нове зображення з новим розміром, перебираємо всі його точки. Для
кожної точки нового зображення шукаємо "батьківську". А від неї беремо сусідні.
Компоненти кольору нового пікселя вибираються як лінійна комбінація компонент
сусідів, помножених на коефіцієнти. коефіцієнти вибираються виходячи з величини
відхилення реального пікселя від точної величини (через те, що арифметика зміни
масштабу зображення не целочисленная))
3 Бікубічеський: Береться 16 сусідніх пікселів.
4 Використання сплайнів. За 16-ти точках будується двовимірний сплайн.
● адаптивні. Алгоритми розглядають околиця кожної точки і намагаються визначити, чи є
вона граничної. В цьому випадку ваги коректуються. Ці алгоритми не є універсальними: для
кожної інтерполяції (поворот, масштаб, вигин) вони специфічні.
Проблеми інтерполяції:
1 алиасинг(Ступінчастість). Боротьба з Алиасинг - згладжування.
2 Розумієте
3 Гало-світіння, Що виникає при підвищенні різкості
4 Кожна інтерполяція вносить похибки, тому кілька трансформацій
краще робити відразу.

7
13. Бінаризація зображень. метод Оцу
бінарне зображення: На кожен піксель відводиться один біт (1 = білий, 0 = чорний)
Чорно-біле зображення: На кожен піксель відводиться кілька біт, які показують рівень яскравості.
Бінарні зображення використовуються в деяких пристроях введення-виведення, чорно-білі - при
завданні форми об'єктів (ч / б прозорість).
завдання бинаризации - переклад чорно-білого зображення в бінарне.

методи:
1 порогова бінаризація
Вхідне зображення задається інтенсивністю I (x, y). Вихідне зображення визначається як O
(x, y) = (I (x, y) <A? 0: 1). Значення порога А можна міняти, щоб отримати прийнятну
картинку: при підвищенні порога краще проглядаються яскраві деталі, при зниженні - темні.
2 метод Оцу.
HxW = кількість пікселів. Гістограма
яскравості показує, скільки яких пікселів
- темних і світлих. Значення порога t
автоматично вибирається так, щоб
зважена сума внутрішньогрупових
дисперсій була мінімальна.

Більш формально:
i = 0..max - яскравість
c (i) - кількість пікселів з яскравістю i
c(i)
pi = - ймовірність появи пікселя з яскравістю i
H⋅W
q1 (t) = ∑ti=0 pi - ймовірність появи пікселя темніше t
q2 (t) = ∑max
i=t+1 pi - ймовірність появи пікселя світліше t
i⋅pi
M1 (t) = ∑ti=0 ; - cредняя яскравість пікселів в групах.M2 (t) =
q1 (t)
i⋅pi
∑max
i=t+1 q2 (t)
∑ti=0 (i−M1 (t))2 pi
δ12 (t) = q1 (t)
; - дисперсія (величина розкиду середнього значення).δ22 (t) =
∑max
i=t+1 (i−M2 (t))2 pi
q2 (t)

8
тоді
t: δ12 (t)q1 (t) + δ22 (t)q2 (t) → min

3 Метод імені мене. Кожен піксель вхідного зображення випадковим чином замінюється на
чорний або білий, причому ймовірність вибору білого кольору залежить від яскравості
𝐼𝑥,𝑦
вихідного пікселя: 𝑝𝑥,𝑦 (белый) =
𝑚𝑎𝑥

14. Алгоритм Флойда-Стейнберга


При використанні методу порогової бинаризации можливі великі помилки (відхилення від
вихідного зображення). Наприклад, область, де яскравість всіх пікселів трохи нижче порога, стане
повністю чорної. Однак якщо в такій області чергувати чорні і білі пікселі, то візуально область
буде здаватися сірою. Змінюючи співвідношення ч / б пікселів, можна маніпулювати градаціями
сірого.

При порогової бинаризации колір пікселя визначається як


O (x, y) = (I (x, y) <A? 0: Imax)
При цьому виникає помилка
Е (x, y) = I (x, y) - O (x, y)
E (x, y) = I (x, y) <A? I (x, y): I (x, y) - Imax
Помилка Е показує, наскільки колір став світлішим (E <0) або темніше (E> 0), ніж в оригінальному
документі. Алгоритм Флойда-Стейнберга враховує величину помилки, додаючи її до вихідної
інтенсивності сусідніх пікселів. Таким чином, помилка поширюється, і "сусіди" намагаються її
компенсувати.

9
for (x = xmin; x <xmax-1; x ++)
for (y = ymin; y <ymax-1; y ++)
{
if (I [x, y] <A)
{Out [x, y] = 0; E = I [x, y]; }
else
{Out [x, y] = 1; E = I [x, y] -Imax; }

I [x + 1, y] + = E * 3/8;
I [x, y + 1] + = E * 3/8;
I [x + 1, y + 1] + = E / 4;
}

Приклад роботи алгоритму (зліва - вихідне зображення, праворуч - після обробки):

15. Метод упорядкованих збуджень


На відміну від порогової бинаризации, в даному методі поріг не фіксований, а вибирається з
матриці порогових значень (збуджень) розміром 2Lx2L, де L визначається виходячи з розмірів
зображення. Зображення розбивається на квадрати такого ж розміру, яскравість кожного пікселя
кожного квадрата порівнюється з відповідним йому значенням в матриці D. Якщо вона менше, ніж
в матриці, то піксель робиться чорним, інакше - білим.

Вимоги до матриці порогових значень:


● Всі елементи різні
● Значення повинні бути рівномірно розподілені - це необхідно для рівномірного розподілу ч /
б пікселів у вихідному зображенні.
● Розмір матриці D кратний двом.
10
Матриця будується за формулою:
M⋅k
Di.j = i⋅j
k = 0. . i ⋅ j
де M - максимальна яскравість. У двовимірному випадку:

в n-вимірному:

де UN - матриця розмірності N, що складається з одиниць.

16. Імітація квітів за рахунок збільшення дозволу растра (маскування)

Поєднання ч / б пікселів вибирається виходячи з кольору


сірого пікселя, кожному кольору ставиться у відповідність
своя комбінація. Існує (n2 + 1) градацій яскравості. Окремо
взята конфігурація схожа на сірий колір, але при розгляді
групи може виникнути мікроузор - якийсь фоновий
малюнок через суміщення візерунків, якими заміняли сірі
пікселі. Іноді потрібно від нього позбудеться (якщо хочемо
отримати реалістичне зображення), іноді він потрібен
(див. НФР).

17. Рівномірний вирівнювання гістограми


... або "як витягають фотографії". Основні завдання:
● Поліпшення сприйняття зображення
● Підготовка до висновку на пристрій
● Попередня підготовка зображення перед розпізнаванням (або просто для перегляду
деталей)
При тональної корекції змінюється яскравість, але не кольору. Перетворення проводяться в
моделях Lab, YCbCr. Кожен піксель обробляється незалежно від інших.
Гістограма показує для кожного значення яскравості
кількість пікселів з такою яскравістю.
тональний діапазон- діапазон значень
інтенсивності, які реально присутні в зображенні;
різниця між найяскравішою і самої темної точкою.
яскравість зображення- середня яскравість всіх
точок. Кажуть, що зображення в темному (світлому)
ключі, коли превалюють тіні (світла).

контраст- співвідношення між тінями і світлами в зображенні. Виділяють локальний і глобальний


контраст.
локальний контраст- контраст на ділянці зображення. Чим більше контраст, тим краще
розглядаються деталі і текстура, проте надмірна контрастність може призводити до
нереалістичність.

Завдання тональної корекції:


1 Повинен використовуватися весь динамічний діапазон (розтягнення тонального діапазону).
2 Гістограма повинна бути вирівняна.
11
3 Повинна бути збережена природність зображення (протиріччя з п.1 та 2).

Рівномірний вирівнювання гістограми


У вихідному зображенні повинні бути присутніми всі можливі значення інтенсивності, і кожне
присутнє значення має зустрічатися приблизно однакове число раз.
Кожному значенню інтенсивності вхідного
зображення i відповідає кількість пікселів Hi з
такою інтенсивністю. Цьому i в вихідному
зображенні будуть відповідати ΣHi пікселів.
Невідома формула: (в якій M, судячи з усього, -
динамічний діапазон). Перебираємо a і b, поки
сума не переплюне значення WH / M, і отримаємо
WH
a1 і b1.∑bj=a Cj → M

Вирівнювання з використанням кривих


Криві дозволяють перерозподілити тональний діапазон, але не дозволяють його розширити. Якщо
просто горизонтальна лінія, то буде заливка кольором (для ч / б зображень) або рівномірний
розподіл яскравості (для кольорових). Кут нахилу кривої показує контрастність зображення, а
висота кривої - яскравість. Різниця між max і min значенням кривої визначається тональним
діапазоном.

На другому малюнку синя закарлюка: вбиваємо контрастність в світлих і темних областях, але
додаємо в середніх.
постерізация - відсутність плавних переходів після обробки.

Деякі можливості кривих можна задавати трьома Цей спосіб завдання називається Levels
параметрами: (рівні).
А - точка чорного Більш складний випадок:
В - точка білого А1 - вихід точки чорного
С - точка півтонів В1 - вихід точки білого

12
18. Нерівномірний вирівнювання гістограми. Тональна і колірна
корекція. Робота зі світлами і тінями
Кривих тепер недостатньо. Коригується тільки частина пікселів (наприклад, хочемо освітлити
якусь темну область). Вхідні параметри:
● тональний діапазон (ширина) в% - та частина діапазону, яку ми вважаємо тінями
(світлами)
● радіус в пікселах
● ступінь впливу: Наскільки будемо освітлювати тіні / затемнювати світла.
Піксель буде затемнюватися (освітлюватися) на зазначену ступінь, якщо виконуються обидві
умови:
1 Його яскравість потрапляє в задану тональну ширину
2 В його оточенні заданого радіуса присутня достатня кількість пікселів, які теж потрапляють
в задану тональну ширину.

Колірна корекція
C допомогою кривих кожен компонент кольору (R, G, B) може оброблятися незалежно. Щоб
зберегти природність кольорів, криві треба задавати узгоджено. Існують кольору, зміна яких
найбільш сильно помітно людині: колір шкіри і сірий колір. В RAW камера автоматично виконує
колірну корекцію.

приклад. На малюнку з сірого зображення зробили зображення, в якому багато корисного і


мало зеленого:
/ * Варіант: На малюнку представлений фільтр, що підвищує рівень корисного і понижуючий
рівень зеленого. * /

Приклад (Катя). Розкидаємо зображення на шари (світла в окремий шар, тіні в окремий),
виробляємо корекцію окремо по шарах.
По-моєму, малося на увазі до цьому зображенню додати шар-маску, для якого
провести корекцію кольору і світла, тому що не бачу я інструменту виділення тіні і
світла як шар.

19. Робота з різкістю зображень. Метод нерезкой маски

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

Для цього можна використовувати метод нерезкой маски.


ідея:
● Якщо при розмиття колір пікселя змінився сильно, то він - граничний.
параметри:
● радіус розмиття - визначає максимальну товщину кордонів.
● ступінь підвищення локального контрасту.
● поріг - визначає мінімальний перепад інтенсивності, необхідний для того, щоб точка
визначилася як гранична.
алгоритм:
1 Створюються допоміжні зображення:
○ розмите - виходить розмиванням вихідного зображення по Гауса.
○ контрастне - виходить підвищенням глобального контрасту вихідного зображення.
○ маска - визначається як різниця вихідного зображення і розмитого.
2 Колір кожного пікселя вихідного зображення береться з:
○ контрастного зображення, якщо відповідний піксель маски більше деякого порога
(тобто в процесі розмиття піксель змінився сильно)
○ вихідного зображення - в іншому випадку.

зауваження. У вихідному алгоритмі після отримання маски вона бінарізуется із зазначеним


порогом. Це може стати в нагоді, якщо нас цікавлять проміжні результати роботи алгоритму, а не
тільки кінцевий.

20. Виділення меж на основі диференціальних масок


джерело: http://habrahabr.ru/post/114452/

Розглянемо спочатку одновимірний випадок. Нехай f (x) - дискретно задана функція, яка визначає
яскравість пікселя з цілої координатою X. Визначимо дискретну похідну як
1
fx′ (x) = (f(x + 1) − f(x − 1))
2
Відповідно, друга похідна - похідна першої похідної - матиме вигляд:
1 1 1 1
fx′′ (x) = (fx′ (x + 1) − fx′ (x − 1)) = f(x + 2) − f(x) + f(x − 2)
2 4 2 4
У загальному вигляді дискретну похідну можна уявити як суму
(n)
fx (x) = ∑ni=−n ωi f(x + i)
де
w- матриця коефіцієнтів (ваг):
○ для:fx′ (x) w = (−0.5; 0; 0.5)

14
○ для:fx′′ (x) w = (0.25; 0; −0.5; 0; 0.25)

Для двовимірного випадку визначимо дискретну похідну як середньозважене одновимірних


похідних в трьох сусідніх точках по горизонталі або вертикалі:

1
∂f
(x, y) = ω1 fx′ (x, y − 1) + ω2 fx′ (x, y) + ω3 fx′ (x, y + 1) = ∑ Mi,j f(x + i, y + j)
∂x
i,j=−1
1
∂f
(x, y) = ω1 fy′ (x − 1, y) + ω2 fy′ (x, y) + ω3 fy′ (x + 1, y) = ∑ Mi,j f(x + i, y + j)
∂y
i,j=−1
де
M - матриця ваг. При вона матиме вигляд:ω1 = ω2 = ω3 = 1/3

∂f
○ для:∂x

∂f
○ для:∂y

Для використання цілочисельний арифметики і прискорення обчислень зазначені матриці ваг


множать на шість (маска Превітта):

15
Крім того, можна збільшити вагу пікселів тієї ж рядки (стовпці) для зменшення ефекту
згладжування (маска Собеля):

А ще є маска Робертса (відповідає поверненому на 45 ° градієнту):

Щоб не розривати читачеві шаблон, Її можна представити у вигляді матриці 3х3, в якій перший
рядок і стовпець - нульові. Як центральний елемент можна використовувати, наприклад, лівий
верхній. Завдяки меншому розміру працює швидше, ніж маски Собеля / Превітта.

Використовуючи одну з цих масок, можна знайти частинні похідні і в кожній точці зображення, а
значить і вектор градієнта - він показує, наскільки різко змінюється яскравість в точці. За його
∂f ∂f ∂f ∂f
модулю можна визначити, чи є піксель граничним чи ні: ∇f =( , )
∂x ∂y ∂x ∂y
● в точках високого локального контрасту:
○ |∇f| має велике значення;
○ ∇∇f змінює знак, якщо досягає свого екстремуму|∇f|
● в точках низького локального контрасту:
○ перша похідна має мале значення (або 0).

Використання лог-фільтра. Для кожного пікселя робимо два розмиття: маленьке і велике, і
беремо різницю між цими значеннями.
x2 x2 x2
− − −
2σ2 2σ2
f(x) = ce c-радіус згладжування. Лог-фільтр для одновимірного випадку:L(x) = c1 e
2σ2 1 − c2 e 2

При сильному збільшенні впливу можливе виникнення ефекту гало.

Ідея узгоджених фільтрів


Маска - це околиця пікселя, вона може бути розгорнута в вектор чисел. Всі можливі значення
навколишніх пікселів утворюють векторний простір. Його базисом є безліч векторів, в кожному з
яких тільки один ненульовий елемент. А i - базізние вектори, xi - множники. Матриця яркостей
навколо пікселів У цьому ж лінійному просторі можна задати інший базис, елементи якого будуть
мати більш складну структуру, наприклад, наявність вертикальної / горизонтальної кордону. Тоді
якщо ми розкладемо по новому базису околиця, то отримаємо набір чисел, які показують ступінь
схожості околиці на відповідний базовий елемент. Аналізуючи цей набір чисел, можна приймати
рішення про наявність кордону. Елементи, за якими розкладаємо - "узгоджені фільтри".
Наприклад, якщо взяти маску Превітта Mx,X = Σxi Ai X = Σyi Bi

21. Детектор країв Кенні


джерела:
● http://en.wikipedia.org/wiki/Canny_edge_detector
● http://habrahabr.ru/post/114589/

Головне достоїнство методу - він дозволяє виявляти навіть широкі межі.


Вхідні параметри:
● розмах (радіус) згладжування
● верхній поріг інтенсивності - визначає мінімальне значення градієнта для початку
детектування кордону
● нижній поріг інтенсивності - визначає мінімальне значення градієнта для продовження
детектування кордону
16
алгоритм:
1 Згладжування по Гаусаіз заданим розмахом. Межі набувають гладкість, виключаються
розриви.
2 обчислення градієнтав кожній точці за допомогою диференціальних масок. Градієнт
показує, в якому напрямку яскравість зростає найшвидше.
3 Немаксімальное придушення. Для кожного пікселя розглядається пара його сусідів: один
в напрямку градієнта, інший в зворотному напрямку. Якщо величина градієнта середнього
пікселя не є максимальною серед цих трьох, то вона обнуляється.
4 Відстеження контурів. Пошук починається з пікселів, у яких значення градієнта більше
верхнього порогу інтенсивності. Рекурсивно розглядаються сусідні пікселі, у яких значення
градієнта більше нижнього порога інтенсивності.

22. Векторизация растрових зображень. метод Хафа


завдання: Пошук примітивів в растровому зображенні.
Всі примітиви шуканого типу (наприклад, кола, прямі, трикутники і т.п.) описуються рівнянням:
f (x, y, p) = 0
де
x, y - координати [граничного] пікселя,
p - набір параметрів (вектор, зазвичай речовинний), зі зміною якого виходять різні
примітиви.
алгоритм:
1 Будується асоціативний масив А ( "акумулятор"), розмірність якого дорівнює кількості
елементів в p. На початку масив повністю складається з нулів (або просто порожній).
○ Наприклад, для прямої y = kx + b потрібно використовувати двовимірний масив, так
як є два невідомих параметри: p1 = k і p2 = b. Два вимірювання масиву А
відповідають різним значенням параметрів k і b.
2 Для кожної точки <і її сусідів> алгоритм визначає, чи достатній вага кордону в цій точці.
Якщо так, то обчислюються параметри всіх можливих примітивів, що проходять через цю
точку в заданому напрямку (використовуємо напрямок градієнта), і збільшуються відповідні
цим параметрам значення в осередках акумулятора.
3 Серед значень масиву А знаходяться ті, які перевершують певний поріг. Відповідні їм
параметри p визначають шукані примітиви.

зауваження (Босик Босіковіч)


● З математичної точки зору, безліч параметрів p може бути нескінченним (наприклад, через
одну точку можна провести нескінченно багато прямих), тому в практичній реалізації буде
потрібно зробити це безліч обмеженим і дискретним.
● Можливо, на третьому кроці перед пошуком максимумів доведеться спочатку згладити (
"розмити") масив p.

випадок відрізків
Шукаємо відрізки, які починаються в (0,0). Для кожного пікселя
зображення дивимося, якщо значення більше деякого порога, то він
потенційно лежить на відрізку, який закінчується в (a, b). Збільшуємо
всі елементи масиву А, які відповідають прямим, через які може
проходити даний піксель. В результаті ті значення (a, b), для яких в
матриці A знаходяться значення, великі деякого порога, будуть
характеризувати найімовірніші примітиви.

17
Яке рівняння краще використовувати для завдання прямої?
● y = kx + b - не дозволяє описати вертикальну пряму.
● ax + by + c = 0 - тут три параметра, багато.
● xcosα + ysinα = d - два параметра, нормально. α-кут, d-відстань.
Знаючи градієнт і α, можемо знайти d.

проблеми:
● Може бути дуже великий масив А
● Ефективність залежить від того, яким чином задано рівняння примітиву, тобто скільки
параметрів у векторі р.
● Для одного (x, y) знаходимо безліч (a, b)

випадок окружності
Окружність задається параметрами (a, b, r): (a, b) - центр, r - радіус.
Знаходимо градієнт в граничної точці. Його напрямок збігається з
напрямком r, значить на цій прямій десь лежить центр кола. Перебираємо
всі можливі значення радіуса, отримуємо набір значень (a, b, r) і
збільшуємо елементи масиву А, розташовані по цих координатах.

23. Визначник прямих Барнса


Для кожного пікселя зображення знаходимо градієнт і в окрему матрицю заносимо значення,
відповідне кутку градієнта, квантованим на вісім частин: 0 - [0 °, 44 °]; 1 - [45 °, 89 °] ... 7 - [315 °,
359 °] (для зберігання номера сектора досить трьох біт). Потім до всіх кутах додаємо 22,5 ° і в іншу
таку ж матрицю заносимо теж числа від 0 до 7, але використовуючи нові значення кутів.
У кожній з двох матриць за допомогою хвильового алгоритму відбувається пошук груп сусідніх
пікселів, що мають однакове значення. Ці пікселі називаються зв'язковими. Потім відповідні групи
в двох матрицях порівнюються, і в якій групі зв'язкових пікселів більше, ту і вважаємо відрізком.
Якщо один піксель входить в два відрізки, то вважаємо, що він належить тому, в якому більше
пікселів.

24. Методи сегментації зображень. Моделі опису сегментів


сегментація- розбиття зображення на монотонні області. Усередині кожного сегмента (до
обробки) пікселі мають приблизно однаковий колір. На кордонах сегментів відбувається різка
зміна кольору.

Класи методів сегментації:

18
● Методи, які використовують кластеризацию
○ Визначається метрика P (x, y), що показує схожість
квітів x і y.
○ Безліч всіх кольорів, наявних на зображенні,
розбивається на кілька непересічних підмножин -
кластерів - так, щоб "відстань" між будь-якими двома
елементами одного кластера було набагато менше, ніж
відстань між елементами різних кластерів.
○ Геометрично точки одного кластера можуть
перебувати в різних частинах зображення
● Методи нарощування областей
○ Створюється новий кластер, що містить одну базову
точку
до сегментації
○ У кластер додаються всі сусідні до базової точці, схожі
з нею за кольором
○ Процедура повторюється рекурсивно з доданими
точками
○ модифікації:
■ Порівнювати кольору з сусідніми точками
■ Порівнювати кольору з базовою точкою
■ Порівнювати з середнім значенням кольору в
накопиченому кластері (важливо, з якого пікселя
починається пошук)

після сегментації

● метод вододілу
Градієнт яскравості / кольору ∇ f показує ступінь межовості
пікселя, ∇ ∇ f - напрямок, в якому швидше за все зростає
ступінь межовості. Беремо деякий піксель, обчислюємо ∇ ∇ f в
ньому і рухаємося в протилежному напрямку до пікселя, в
якому буде мінімальне значення ∇ ∇ f. Якщо ∇ ∇ f = 0, то (ми
досягли локального екстремуму градієнта) піксель утворює
окремий сегмент, інакше він належить сегменту,
розташованому в напрямку, протилежному ∇ ∇ f.

Способи зберігання сегментів:

1 маркіроване зображення. Для кожного пікселя вказується


число - номер сегмента, до якого він належить.
Використовується дуже багато пам'яті, зате дозволяє
визначити приналежність точки сегменту за О (1).
2 квадрантні дерева. Якщо квадрант повністю входить в деякий
сегмент, то записується номер цього сегмента, в іншому
випадку квадрант ділиться на чотири, і процедура рекурсивно
повторюється, поки не буде досягнута необхідна точність.

19
Результат зберігається у вигляді дерева. На прикладі два
сегмента 0 і 1.
3 кодування кордонів. У сегмента межа замкнута, ⇒ можна її
обійти по (проти) годинниковою стрілкою. Зберігаються
координати початкової точки і закодований шлях обходу (← ↑
→ ↓). Використовується мало пам'яті, але незручно
працювати.

Двовимірна растрова графіка

25. Алгоритм Брезенхема для малювання відрізків


Основні вимоги до алгоритму:
1 Висока швидкість роботи.
2 Повинна використовуватися тільки целочисленная арифметика.
3 Мінімальна витрата пам'яті.
4 Бажано, щоб алгоритм був інкрементного (цикл не повинен робити повторні обчислення, а
повинен коригувати раніше отримані).
5 Примітиви повинні бути восьми- або четирёхсвязнимі (скільки сусідніх пікселів, з якими
пов'язаний поточний).

Методи растеризации відрізка:


1 DDA(Digital Difference Analytics). Цікавий з теоретичної точки зору. Кожна точка відрізка
визначається як
x (t) = x0 + Δx * t
y (t) = y0 + Δy * t
t ε [0,1]
де
Δx = (x1 - x0) / L
Δy = (y1 - y0) / L
L = max (| x1 - x0 |, | y1 - y0 |)

2 алгоритм Брезенхема. Розглянемо випадок побудови відрізка


з точки (0,0) в задану точку в першому Октант (інші випадки
виходять з використанням повороту, симетрії і т.п.)
Робимо x кроків, на кожному кроці переміщаємося або вправо,
або по діагоналі вправо-вгору і вважаємо помилку е - відстань
між реальною точкою на відрізку і координатами пікселя.

○ Якщо е <½, то йдемо вправо і збільшуємо помилку е = е + dy / dx


○ Якщо e ≥ ½, то йдемо по діагоналі і зменшуємо помилку: е = е - 1
недоліки:
○ алиасинг (при великому растре видно ступенчатость)
○ використання речової арифметики
Щоб виправити другий недолік, можна внести наступні зміни:
○ спочатку з е відняти ½
○ порівнювати помилку ні з ½, а з нулем
○ помножити збільшення e на 2dx:
20
■ при кроці вправо: е = е + 2dy,
■ при кроці по діагоналі: e = e - 2dx.
При відображенні поточного пікселя необхідно знати помилку е для наступного кроку, щоб
прийняти рішення, куди йти.

Сам алгоритм (варіант з целочисленной арифметикою):


x = x1;
y = y1;
Dx = x2-x1;
Dy = y2-y1;
e = 2 * Dy-Dx; // e = -Dx; ?
for (i = 1; i <Dx; i ++)
{
Plot (x, y); //отрисовка точки
if (e> = 0)
{
y ++;
e- = 2 * Dx;
}
x ++;
e + = 2 * Dy;
}

3 алгоритм Ву (Модифікація алгоритму Брезенхема)


На кожному кроці малюємо не одну точку, а дві, причому яскравості розподіляємо між ними
в залежності від величини помилки e:

а) крок по горизонталі б) крок по діагоналі

26. Алгоритм Брезенхема для малювання кіл


Розглянемо випадок малювання дуги, яка знаходиться в третьому і четвертому октантах (інші
частини окружності малюються аналогічно).
Ініціалізіруем x = -R, y = 0. Чи можемо рухатися або вгору, або по діагоналі вправо-вгору.
Піксель може перебувати або в колі, або поза нею. Відстань від пікселя до окружності:
f (x, y) = x2 + y2 - R2
Якщо f (x, y)> 0, то піксель знаходиться поза колом, робимо крок по діагоналі

21
Інакше - всередині, робимо крок вгору.
Крок - це x ++ і y ++, при цьому перераховуємо f (x, y).
При малюванні еліпса необхідно множити x або y на деякий коефіцієнт. До точки дотику еліпса з
дотичній 45 ° крок робиться по діагоналі, або по горизонталі, а після - по горизонталі або по
вертикалі.

отрісовка дуг
Задаються: центр, радіус R, α і β. Для кожного октанта
промальовується частина дуги, яка потрапляє в цей октант. Як
перевірити, чи потрапляє піксель в октант? Можна знайти
точки Z, і якщо піксель потрапляє в проміжок між ними, то він
потрапляє в октант.

27. Криві Безьє. Алгоритм де Костельжо


криві Безьє- це універсальний спосіб завдання довільних кривих на площині або в просторі.
Задаються многочленом Берштейна:
n

P(t) = ∑ Cin t i (1 − t)n−i Pi


i=0
де
n - ступінь кривої
P0 .. Pn - опорні точки, їх як мінімум дві
t ∈ [0,1]
властивості:
● Гладкість і безперервність
● Кількість вигинів залежить від кількості опорних точок
● Ступінь многочлена Берштейна на один менше кількості опорних точок
● Легко виконати складні перетворення (поворот, перенос, ..., або їх комбінація)
● Крива лежить в оболонці опорних точок, яка є багатокутником.
● Крива завжди проходить через P0 і Pn, і в цих точках дотичні до кривої паралельні
відрізкам P0P1 і Pn-1Pn.
● Якщо розглядати точки в зворотному порядку, то форма кривої не зміниться.
● Якщо криву Безьє розбити точкою P (t *), то ми отримаємо дві криві Безьє: t ∈ [0, t *] і t ∈ [t *,
1]. Таким чином, криву Безьє вищого порядку порядку можна представити у вигляді набору
кривих Безьє нижчого порядку.
недоліки:
● Дуже багато речових обчислень
● Важко підібрати Δt:
○ якщо взяти занадто великим, будуть розриви,
○ якщо взяти занадто маленьким, промальовування буде повторюватися кілька разів.

Алгоритм де Костельжо

22
Завдання: побудувати криву P (t) по ламаній P0 ... Pn.
Спочатку беремо t * = ⅓ і ділимо в такому ставленні
кожна ланка ламаної. Отримані точки з'єднуємо і
отримуємо нову ламану, ступінь якої менше ступеня
вихідної ламаної на 1. Повторюємо процес, поки
ступінь не стане дорівнює одиниці, тобто поки
ламаного виродиться в точку. Ця точка буде належати
кривої Безьє.
Далі беремо t * = ½ і повторюємо алгоритм, і так далі,
поки t * Не зіллється з P0 (із заданою точністю)
Вікіпедія: отримані в процесі побудови проміжні точки є
опорними точками для двох нових кривих Безьє, в
точності збігаються з вихідної, і в сукупності дають
вихідну криву Безьє.
NURBS - раціональні криві Безьє. Для кожної точки вводиться ще й вага (може бути і негативним).
Він показує, наскільки точка "притягує" до себе криву. У цьому випадку крива задається: -
∑n ωi Pi Bn
i (t)
многочлен Берштейна.P(t) = i=0
∑n
; Bin = Cin t i (1 − t)n
i=0 ωi Bn
i (t)
У звичайній кривій Безьє все w = 1.

28. Алгоритми малювання закрашеного багатокутника


Зафарбована фігура може бути задана кордоном або растром і точкою, від якої хочемо виконати
заливку. алгоритми:
1 Алгоритм з упорядкованим списком ребер (Для зафарбовування багатокутників)
Горизонтальні прямі, паралельні осі ОХ, перетинають
багатокутник в декількох точках, їх число парне.
1 Обчислюються координати охоплює
прямокутника: ymin, ymax, xmin, xmax.
2 Знаходяться координати всіх пікселів, які
належать кордонів. Чи не розглядаються
вершини багатокутника і торцеві ребра (що
належать охоплює прямокутника).
3 Масив з цими координатами сортується,
причому спочатку порівнюються координати y, а
потім - х.
4 В отриманому масиві перша точка з'єднується з другою, ..., i-я c (i + 1) -ої. Таким
чином виходять горизонтальні відрізки, що знаходяться всередині багатокутника, які
називаються сканирующими рядками.
недолік:
○ при великій кількості точок на сортування піде багато часу.
Рішення недоліки: Розділимо масив точок на кілька маленьких. Можна розділити так, щоб в
кожному масиві були точки з однаковою координатою у. Тоді не треба буде всередині них
зберігати у - він же у всіх однаковий. Маленькі масиви легко і швидко сортувати, +
використовується менше пам'яті, тому що після того, як намальовані всі прямі з точками з
деякого масиву, його можна видалити з пам'яті і створити новий - це називається
"отрисовка в міру необхідності".
2 Алгоритм зі списком активних ребер.
Ребра діляться на активні (растеризувати) і неактивні. Беремо до уваги ребра по мірі
промальовування. Тобто, ті ребра, які не беруть участі в відображенні поточної лінії,
відсутні в масиві.

23
29. Алгоритми заповнення довільних областей

1. Алгоритм заповнення з запалом (= заливка)


Вхід: межа фігури, кольори заливки та кордони, початкова точка.
Спочатку закрашивается початкова точка, а також всі ті, які можуть
бути з нею пов'язані безперервним відрізком, не перетинаючи
кордон. Потім перевіряються всі сусідні пікселі початкової точки:
якщо їх колір відрізняється від кольору кордону, то робимо
рекурсивний виклик.
недоліки:
● дуже багато рекурсивних викликів ⇒ переповнення стека. Для
захисту від переповнення можна використовувати свій
власний стек, але тоді буде витрачено багато пам'яті.

2. Порядковий алгоритм заповнення з запалом.


Вхідні параметри - ті ж самі.
Від початкової точки рухаємося вліво і вправо, поки не досягнемо
кордону. Отримуємо точки, що лежать на кордоні, і малюємо
відрізок. У циклі розглядаються всі крапки над і під цим відрізком, і
рекурсивно викликаємо процедуру для всіх знайдених
незакрашенних точок.

оптимізація методу
При перевірці рядка над / під поточної все її пікселі перевіряються на
приналежність кордоні:
● Якщо граничних точок немає, то в стек додається одна
(довільна) точка з перевіряється рядки.
● Якщо граничні точки є, то вони розбивають рядок на підрядка,
від кожної з яких в стек додається по одній точці.
В обох випадках додаються точки повинні бути незафарбованими.

немонотонна зафарбування
Колір кожного пікселя визначається деякою функцією f (x, y, c), де х, у - координати, з - колір.
● Якщо f ≡ const, то це монотонна зафарбування.
● якщо c ≠ const, то це - коригування заливки, а не заливка.
Наприклад, ефект градієнта полягає в закраске декількох точок заданими кольорами, а кольори
решти пікселів знаходяться аппроксимацией цих заданих кольорів.

Якщо f задається явно, конкретними значеннями, то ми отримуємо текстурирование. При закраске


текстурою для кожної точки зображення (x, y) обчислюється відповідна точка текстури (i, j).

24
Накладання текстури тісно пов'язане із завданням інтерполяції, тому що колір одного пікселя може
визначатися виходячи з декількох сусідніх пікселів.

Якщо координати (i, j) лінійно залежать від (x, y), то задача обчислення текстурних координат
може бути оптимізована за допомогою инкрементной реалізації: якщо точці (x, y) відповідає точка
(i, j), то
∂i ∂j
● точці буде відповідати (x ± 1, y)(i ± ∂x , j ± ∂x)
∂i ∂j
● точці буде відповідати (x, y ± 1)(i ± ∂y , j ± ∂y)
де
∂i ∂i ∂j ∂j
- приватні похідні від функцій, що зв'язують (x, y) і (i, j).∂x , ∂y , ∂x , ∂y

30. Малювання стилізованих примітивів (товщина і накреслення ліній,


текстури)
● Для малювання жирних ліній (прямих, кривих Безьє, і т.д.) треба замість зафарбовування
пікселя зафарбовувати його околиця деяким пером, форма якого задається. Але щоб одні
й ті ж пікселі НЕ перемальовувалися кілька разів, потрібно враховувати кут нахилу лінії і
коригувати форму пера.
● Для малювання пунктирних ліній відводиться масив бітів, який задає маску для потрібного
типу лінії (візерунок): 1 - піксель треба малювати, 0 - не треба. При малюванні лінії маска
послідовно накладається, і визначається, малювати піксель чи ні.
● При малюванні жирної лінії пунктиром за рахунок товщини пера можуть зафарбовувати
пропуски в пунктиром ⇒ необхідно підбирати форму пера виходячи з нахилу і типу лінії.

31. Растеризация тексту. шрифти


шрифт - набір зображень букв і знаків, виконаних в єдиному стилі.
Параметри шрифтів:
● накреслення (Прямий або курсив)
● насиченість (Відношення товщини букв, штрихів до ширини літерного просвіту. Bold)
● моноширинний.
○ Моноширинних шрифти - у всіх букв однакова ширина. Зручно для
використання в псевдографіка (малювання таблиць спецсимволами), в
ASCII-art і в програмуванні.
○ Пропорційні - у всіх букв різна ширина.
● Розмір - вимірюється в пунктах (1/72 дюйма). Використовується для пристроїв виведення.
● Кодування - визначає алфавіт, який використовується для друку.
● векторний / растровий
○ растровий: Зображення букв зберігаються в бітових матрицях. Отрісовка таких
шрифтів аналогічна відображенні текстур.
■ переваги:
● Простота і ефективність реалізації
● Потрібно мало пам'яті (зображення окремих букв мають занадто
малий розмір, щоб ефективно стискатися при векторизації; крім того,
ці зображення можуть бути монохромними).
■ недоліки:
● Проблеми інтерполяції при трансформації (масштабування, поворот і
ін.) Частково вирішує проблему наявність різних варіантів шрифту для
різних розмірів.

25
○ векторний: Літери складаються з гліфів. Гліф - це елемент символу. Гліфи бувають
простими (зафарбований примітив, межа якого - крива Безьє) і складовими (є
комбінацією простих або складених). Векторні шрифти мають ті ж переваги і
недоліки, що і векторні зображення: більше образотворчих можливостей, але
складніше отрисовка. Отрісовка зводиться до малювання кривих Безьє і
зафарбовування примітивів. Хінтінг - це підпрограми, які зберігаються разом з
шрифтом і коректують параметри гліфів при значному масштабування. Наприклад,
при збільшенні букви Ц в 20 разів горизонтальна лінія повинна зростати швидше, ніж
вертикальні.

завдання растеризации
● Вхід: напис, шрифт, кодування, координати
● Вихід: растр

32. Важливість і постановка задачі двовимірного відсікання


Причини, за якими завдання відтворення важлива:
1 час. Якщо примітив виходить за межі екрану, то він не буде видно, проте час на його
отрисовку все одно буде витрачено.
2 Артефакти.У пам'яті комп'ютера зображення зберігається у вигляді послідовності масивів-
рядків. Якщо в програмі відсутні перевірки на вихід за межі масиву, то при спробі доступу
до ділянки зображення за його межами можуть виникнути графічні артефакти. Наприклад,
при відображенні пікселя, що знаходиться за межами екрану праворуч, він буде
намальований зліва рядком нижче.

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

Параметри відсікання:
● Відсікає фігура (примітив, який малюємо)
● Відсікає фігура (примітив, який задає видиму частину; вікно видимості)
● Вид відсікання:
○ Зовнішнє - залишаємо все, що поза відтинає фігури.

○ внутрішнє - залишаємо все, що всередині відтинає фігури.

26
33. Алгоритм Сазерленда-Коена

Це алгоритм внутрішнього відсікання відрізка прямокутним


вікном.
Продовжуючи кордону вікна видимості, отримуємо дев'ять
частин, кожна з яких кодується четирёхбітним кодом:
● Біт # 1 = (область строго лівіше відсікаючого вікна)
● Біт # 2 = (область строго правіше відсікаючого вікна)
● Біт # 3 = (область строго вище відсікаючого вікна)
● Біт # 4 = (область строго нижче відсікаючого вікна)

Нехай A і B - коди, відповідні кінців відрізка. тоді:

Умова пояснення висновок

(A OR B) = 0 Коди містять тільки нулі, Відрізок повністю видно


тобто обидва коди - 0000.

(A AND B) ≠ 0 Коди містять одиничний біт в Відрізок повністю не видно


одній і тій же позиції.

(A AND B) = 0 У кожному розряді одного з Відрізок частково бачимо. Переносимо точку,


кодів є нуль. у якій код ≠ 0, в місце перетину відрізка з
однією з меж (наприклад, якщо включений 1й
біт, то з лівого, якщо 2й, то з правого і т.д.) і
повторюємо алгоритм.

В результаті від відрізка залишиться тільки видима частина.

недоліки:
● При обчисленні точки перетину відрізка і прямий використовується повільна речова
арифметика
● У деяких випадках для отримання відповіді потрібно кілька ітерацій

34. Алгоритм розбиття середньою точкою


Є модифікацією алгоритму Сазерленда-Коена: точки перетину знаходяться не безпосереднім
обчисленням, а методом бінарного пошуку. Перший і другий випадки обробляються аналогічно, а
в третьому випадку відрізок ділиться навпіл, і кожна з частин обробляється окремо. В кінці всі
видимі частини склеюються в один відрізок, який і буде результатом.

27
переваги:
● Використовується тільки целочисленная арифметика (поділ на два реалізується як
зрушення вправо на один біт).
недоліки:
● Велика кількість ітерацій.

35. FastClip алгоритм (швидкого відсікання)


Є оптимізацією алгоритму Сазерленда-Коена.
Всі можливі варіанти розташування кінців відрізка кодуються восьмібітних кодом (по чотири біта
для кожного кінця), який інтерпретується одним великим switch з 72 варіантами (всього 92 = 81, з
них дев'ять симетричних). Для кожної ситуації реалізується свій, найбільш оптимальний алгоритм
знаходження відповіді.

36. Алгоритм Ліанга-Барські


Відрізок можна уявити в векторно-параметричної
вигляді:
V (t) = v0 + t (v1 - v0), t ∈ [0,1],
або, покоординатно, Рис 1. Резистор
x (t) = x0 + t (x1 - x0) = x0 + tΔx
y (t) = y0 + t (y1 - y0) = y0 + tΔy
Вимагатимемо також, щоб
x0 ≤ x1
y0 ≤ y1
Тоді задача полягає в знаходженні t0 і t1, які будуть відповідати початку і кінця видимої частини
відрізка. Поставимо умова видимості:
Xл ≤ x (t) ≤ xп
Yн ≤ y (t) ≤ Yв
або
Xл ≤ (x0 + tΔx) ≤ xп
Yн ≤ (y0 + tΔy) ≤ Yв
що рівносильно системі з чотирьох нерівностей:
-tΔx ≤ x0 - Xл
tΔx ≤ xп - x0
-tΔy ≤ y0 - Yн
tΔy ≤ Yв - y0
Загальний вигляд цих нерівностей:
Pit ≤ Qi i = 1..4
де
P = {-Δx; Δx; -Δy; Δy}
Q = {x0 - Xл; xп - x0; y0 - Yн; Yв - y0}
Кожне з них відповідає одній зі сторін відсікаючого вікна. Ініціалізіруем t0 = 0 і t1 = 1 (що означає,
що відрізок повністю видно) і послідовно перевіряємо всі умови:
● Якщо Pi> 0, то t ≤ Qi / Pi ⇒ t1 ≤ Qi / Pi ⇒ t1: = min (t1, Qi / Pi)
● Якщо Pi <0, то t ≥ Qi / Pi ⇒ t0 ≥ Qi / Pi ⇒ t0: = max (t0, Qi / Pi)
● Якщо Pi = 0, то пряма паралельна стороні відсікаючого вікна. В цьому випадку:
○ якщо Qi ≥ 0, то переходимо до наступного нерівності,
○ якщо Qi <0, то відрізок повністю не видно. break.

28
37. Алгоритм Кірус-Бека
Продовжує ідею алгоритму Ліанга-Барські для вікна видимості у вигляді опуклого багатокутника з
вершинами F1 ... Fn, розташованими за годинниковою стрілкою.
Заснований на параметричному представленні
відрізка. Будуємо n нерівностей Pit≤Qi для n-
кутника.
Розглянемо i-ю сторону: [Fi, Fi + 1].
Знаходимо внутрішню нормаль Ni.
(Ni, FiFi + 1) = 0
nx (xi + 1-xi) + ny (yi + 1-yi) = 0
Покладемо nx = 1; ny = (xi-xi + 1) / (yi + 1-yi).
(Знаменник може бути 0, якщо межа
горизонтальна, нормаль вертикальна).

Після знаходження нормалі потрібно визначити, внутрішня вона або зовнішня.


Якщо (N, Fi-1Fi) <0 то нормаль внутрішня. Якщо> 0, множимо нормаль на -1.
Знайшли внутрішню нормаль.
Pi = (Ni, (V1-V0))

Якщо (Pi> 0) то збільшуємо t0, інакше зменшуємо t1.


Якщо Pi = 0, то грань колінеарну з вектором.

Qi (t) = (V (t) -Fi, N)


Qi (t) <0; кут більше 90 ', точка зовні
Qi (t)> 0; точка всередині
Qi (t) = 0; точка лежить на стороні багатокутника.

Вирішуючи рівняння Qi (t) = 0, отримаємо t, що позначає перетин відрізка з гранню.


Якщо Pi> 0, то це t - мінімальне t0.
Якщо Pi <0, то це t - максимальне t1.
Якщо Pi = 0, то відрізок паралельний.
Qi> 0 - продовжуємо, переходимо до наступного нерівності.
Qi <0 - відрізок невидимий.
Qi = (V0-Fi, Ni)

38. Алгоритм Сазерленда-Ходжмена


Відсікання опуклим багатокутником будь-якого багатокутника.
У циклі розглянемо боку відсікаючого багатокутника. Кожен раз
відрізаємо по шматочку прямий. У внутрішньому циклі розглянемо
вершини відсікається багатокутника і формуємо новий масив вершин.

29
У кожного ребра може бути чотири стану:
● ребро мабуть
● Ребро виходить з області видимості
● ребро невидимо
● Ребро входить в зону видимості.
На кожному кроці розглядаємо Pi-1, Pi. S - остання
додана в результат вершина. Якщо [S, Pi] повністю
мабуть, додаємо Pi в результат, S = Pi. (P1P2 -
повністю мабуть).
Якщо відрізок виходить, точку перетину (A) додаємо як S. (P2P3).
Якщо ребро невидимо, нічого не додаємо (P3P4).
Якщо ребро входить, додаємо і точку перетину (B), і кінець ребра (P4, P5).
Так йдемо до кінця.

30

You might also like