Компьютерная графика: растр, вектор, цветовые модели
Отличия растровой и векторной графики, разрешение и глубина цвета, модели RGB, CMYK и HSV, сжатие с потерями и без, алгоритмы растеризации и преобразования.
Курсовая по компьютерной графике обычно состоит из теоретической части о представлении изображений и практической — реализации алгоритма построения или преобразования. Разберём базу для обеих.
Растр или вектор
| Признак | Растровая | Векторная |
|---|---|---|
| Что хранится | Массив пикселей с цветами | Формулы и координаты объектов |
| Масштабирование | Теряет качество | Без потерь |
| Размер файла | Зависит от разрешения | Зависит от числа объектов |
| Фотографии | Подходит | Не подходит |
| Чертежи и логотипы | Плохо | Идеально |
| Форматы | JPEG, PNG, BMP, TIFF | SVG, AI, DXF, EPS |
| Где применяют | Фото, текстуры, сканы | САПР, полиграфия, интерфейсы |
Объём несжатого растрового изображения: V = ширина · высота · глубина_цвета / 8 [байт] Пример: 1920 × 1080, 24 бита на пиксель V = 1920 · 1080 · 24 / 8 = 6 220 800 байт ≈ 5,93 МБ С альфа-каналом (32 бита) — 7,91 МБ
Разрешение и глубина цвета
| Глубина | Число цветов | Применение |
|---|---|---|
| 1 бит | 2 | Штриховые изображения, факс |
| 8 бит | 256 | Индексированная палитра, GIF |
| 16 бит | 65 536 | High Color, устаревший режим |
| 24 бита | 16,7 млн | True Color — стандарт |
| 32 бита | 16,7 млн + прозрачность | Графика с альфа-каналом |
| 48 бит | По 16 бит на канал | Профессиональная обработка фото |
Разрешение печати измеряют в dpi: для качественной печати нужно 300 dpi, для экрана достаточно 72-96 ppi. Отсюда пересчёт: чтобы напечатать снимок 10 × 15 см с качеством 300 dpi, нужен файл примерно 1200 × 1800 пикселей.
Цветовые модели
| Модель | Тип | Компоненты | Где применяется |
|---|---|---|---|
| RGB | Аддитивная | Красный, зелёный, синий | Экраны, камеры |
| CMYK | Субтрактивная | Голубой, пурпурный, жёлтый, чёрный | Печать |
| HSV / HSB | Перцептивная | Тон, насыщенность, яркость | Интерфейсы выбора цвета |
| Lab | Аппаратно-независимая | Светлота и две хроматические оси | Преобразование между моделями |
| Grayscale | Одноканальная | Яркость | Обработка, распознавание |
Перевод в оттенки серого с учётом чувствительности глаза: Y = 0,299·R + 0,587·G + 0,114·B Простое усреднение (R+G+B)/3 даёт заметно худший результат: зелёный воспринимается ярче синего почти в пять раз. RGB в HSV: V = max(R,G,B) S = (max − min)/max H вычисляется по тому, какой канал максимален
Сжатие
- Без потерь: RLE (кодирование серий), LZW, Deflate в PNG. Изображение восстанавливается точно, коэффициент сжатия скромный.
- С потерями: JPEG — дискретное косинусное преобразование, отбрасывание малозначимых высокочастотных коэффициентов, квантование. Сжатие в десятки раз, но появляются артефакты.
- JPEG плохо подходит для текста и чертежей: вокруг резких контуров возникает ореол. Для скриншотов и графики берут PNG.
- Повторное сохранение JPEG накапливает искажения — каждое пересохранение ухудшает изображение необратимо.
Алгоритмы растеризации
def bresenham_line(x0, y0, x1, y1):
"""Алгоритм Брезенхема: только целочисленная арифметика."""
points = []
dx, dy = abs(x1 - x0), abs(y1 - y0)
sx = 1 if x0 < x1 else -1
sy = 1 if y0 < y1 else -1
err = dx - dy
while True:
points.append((x0, y0))
if x0 == x1 and y0 == y1:
break
e2 = 2 * err
if e2 > -dy:
err -= dy
x0 += sx
if e2 < dx:
err += dx
y0 += sy
return points
def bresenham_circle(xc, yc, r):
"""Окружность: считаем 1/8 и отражаем по симметрии."""
points = []
x, y = 0, r
d = 3 - 2 * r
while x <= y:
for px, py in [(x,y),(y,x),(-x,y),(-y,x),(x,-y),(y,-x),(-x,-y),(-y,-x)]:
points.append((xc + px, yc + py))
if d < 0:
d += 4 * x + 6
else:
d += 4 * (x - y) + 10
y -= 1
x += 1
return points
Ценность Брезенхема — отказ от вычислений с плавающей точкой: только сложение и сравнение целых чисел. Именно поэтому алгоритм 1962 года до сих пор реализован в графических ускорителях.
Аффинные преобразования
Однородные координаты позволяют записать все преобразования матрицами 3×3:
Перенос: | 1 0 tx | Масштаб: | sx 0 0 |
| 0 1 ty | | 0 sy 0 |
| 0 0 1 | | 0 0 1 |
Поворот на φ: | cos φ −sin φ 0 |
| sin φ cos φ 0 |
| 0 0 1 |
Композиция преобразований = произведение матриц.
Порядок важен: поворот с последующим переносом ≠ перенос с поворотом.
Сглаживание и фильтры
- Антиалиасинг убирает «лестницу» на наклонных линиях, закрашивая краевые пиксели промежуточным тоном пропорционально покрытию.
- Свёртка с ядром — основа фильтров: размытие по Гауссу, повышение резкости, выделение границ оператором Собеля.
- Медианный фильтр эффективнее гауссова против импульсного шума и при этом не размывает контуры.
- Интерполяция при масштабировании: ближайший сосед даёт резкие пиксели, билинейная — сглаживание, бикубическая — лучшее качество при большей вычислительной цене.
Что делают в практической части
- Реализовать алгоритм построения примитива: линии, окружности, заливки области.
- Реализовать аффинные преобразования объекта с интерактивным управлением.
- Написать фильтр обработки изображения и сравнить результат с исходником.
- Построить гистограмму яркости и выполнить её выравнивание.
- Реализовать перевод между цветовыми моделями и проверить обратимость.
- Замерить время работы и сравнить с библиотечной реализацией.
Частые вопросы
Почему JPEG не подходит для скриншотов?
Алгоритм отбрасывает высокочастотные составляющие, а резкие границы текста как раз ими и образованы. Вокруг букв появляется ореол. PNG сжимает без потерь и для скриншотов даёт файл меньше и качество лучше.
Зачем в CMYK чёрный, если его можно смешать?
Смешение трёх красок даёт грязно-коричневый, расходует втрое больше краски и размачивает бумагу. Отдельная чёрная краска даёт настоящий чёрный и делает печать текста дешевле.
Что такое однородные координаты и зачем они нужны?
Добавление третьей координаты позволяет выразить перенос матричным умножением, а не сложением. Благодаря этому любую цепочку преобразований можно свернуть в одну матрицу и применить за одну операцию.