Перейти к основному содержимому

8.08. Растровая графика

Всем

Растровая графика

1. Основное определение и сущность растрового представления

Растровая графика — это способ цифрового представления изображения, при котором оно моделируется как упорядоченная двумерная совокупность элементарных единиц, называемых пикселями (от picture element — элемент изображения). Каждый пиксель имеет чётко определённое положение в прямоугольной сетке и несёт информацию о цвете, яркости или другой визуальной характеристике. В совокупности эти элементы образуют полное изображение — от однобитной иконки до многомегапиксельной фотографии высокого разрешения.

Растровое представление является дискретным приближением непрерывной реальности. Оно не описывает изображение через геометрические законы или аналитические зависимости (как это делает векторная графика), а фиксирует его состояния в конечном числе точек. Это делает растровую модель естественной для большинства современных устройств ввода-вывода — таких как цифровые фотоаппараты, сканеры, матричные и струйные принтеры, а также дисплеи с фиксированной физической решёткой подсветки или пикселей (LCD, OLED, e-Ink в большинстве режимов).

Именно эта «материальная совместимость» с физическими устройствами определила доминирование растрового подхода в повседневной практике: от отображения веб-страниц до хранения медиафайлов и обработки изображений в профессиональных системах.


2. Пиксель как элементарная единица

Пиксель — логическая единица данных. Его «размер» в пространстве изображения условен и зависит от контекста. При отображении на мониторе один логический пиксель может соответствовать одному или нескольким физическим субпикселям (красному, зелёному, синему элементам матрицы), особенно в условиях масштабирования или работы с высоко-пиксельными дисплеями (Retina, HiDPI). Однако на уровне данных пиксель всегда остаётся неделимой ячейкой — «квадратом» в абстрактной сетке координат.

Цвет пикселя кодируется посредством цифровых значений. Простейший случай — бинарное изображение, где пиксель может принимать ровно два состояния: «включён» или «выключен». В исторически сложившейся терминологии это часто обозначают как «1» (передний план) и «0» (фон), хотя сама семантика этих меток определяется контекстом: в одном случае «1» может означать белый, в другом — чёрный, в третьем — любой другой выбранный цвет.

Важно отделить семантическое понятие бинарности (наличие двух возможных цветовых состояний пикселя) от технического способа его хранения. Хотя наиболее экономичный способ хранения — один бит на пиксель (bit-packed representation), на практике в вычислительных системах часто используют целый байт или даже слово (например, 32 бита) на пиксель, даже если задействован только один бит. Это связано с архитектурными особенностями процессоров: операции над отдельными битами требуют дополнительных шагов (маскирование, сдвиги), тогда как операции с выровненными байтами или 32/64-битными словами выполняются аппаратно и значительно быстрее. Таким образом, «бинарное» не тождественно «однобитовому» — первое описывает содержание, второе — формат хранения.


3. Разрешение и плотность пикселей

Разрешение — ключевая количественная характеристика растрового изображения. Оно определяется как произведение количества пикселей по горизонтали на количество по вертикали (например, 1920 × 1080). Это абсолютная мера, не зависящая от физических размеров носителя: одно и то же изображение с разрешением 3000 × 2000 может отображаться на смартфоне и на плакате, но с разной плотностью.

Плотность пикселей выражается в пикселях на дюйм (PPI — pixels per inch) или — в контексте печати — в точках на дюйм (DPI — dots per inch). Хотя термины часто смешивают, технически DPI относится к физическим «точкам чернил» на печатном листе, а PPI — к цифровой сетке. Для экранов корректнее использовать PPI; для принтеров — DPI. Однако в повседневной практике (и в метаданных изображений) встречается обозначение «DPI», даже если речь о цифровом файле.

Значение PPI/DPI не изменяет размер изображения в пикселях, но определяет, как плотно эти пиксели будут размещены при выводе. Изображение 3000 × 2000 при 72 PPI займёт на экране ~41,7 × 27,8 дюйма (около 106 × 71 см), тогда как при 300 PPI — всего ~10 × 6,7 дюйма (~25 × 17 см). При этом количество информации (пикселей) остаётся одинаковым. Таким образом, PPI/DPI — это инструкция для устройства вывода, а не свойство самого изображения как данных.

Высокое разрешение не гарантирует высокое воспринимаемое качество, если плотность не соответствует возможностям устройства или дистанции просмотра. Например, для билборда, просматриваемого с 50 метров, 10–15 PPI достаточно; для медицинского монитора — требуется 200+ PPI.


4. Масштабирование и его последствия

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

Типичные методы интерполяции:

  • Ближайший сосед (nearest neighbour) — копирует ближайший пиксель. Сохраняет резкие границы, но приводит к «лесенкам» и блочной структуре (пикселизации).
  • Билинейная интерполяция — вычисляет средневзвешенное значение четырёх ближайших пикселей. Сглаживает изображение, но снижает контраст и чёткость.
  • Бикубическая интерполяция — учитывает 16 соседних пикселей и использует кубические функции. Даёт более плавные переходы, но может вызывать «гало» вокруг контрастных границ.
  • Алгоритмы на основе машинного обучения (например, ESRGAN, waifu2x) — обучены на парах «низкое/высокое разрешение», могут восстанавливать детали, отсутствующие в исходнике, за счёт генерации правдоподобных структур. Однако это уже синтез — и результат зависит от модели и данных обучения.

Ни один из этих методов не создаёт новую объективную информацию — они лишь аппроксимируют то, что могло бы быть. Поэтому увеличение изображения всегда сопряжено с риском искажения: размытия, артефактов, ложных деталей.

Уменьшение (даунскейл) также необратимо: пиксели объединяются (субдискретизация), и детали теряются. Если после уменьшения попытаться восстановить исходный размер, получится лишь размытая копия — информация безвозвратно утеряна. Это принципиальное отличие от векторной графики, где масштабирование — математическая операция без потерь.


5. Типы растровых изображений по глубине цвета

Растровые данные классифицируются по способу кодирования цвета. Это не просто техническая деталь — она определяет выразительные возможности, объём, подходы к обработке и сжатию.

5.1. Бинарные (двухуровневые) изображения

Как уже отмечалось, бинарное изображение допускает ровно два цвета на пиксель. Эти цвета могут быть любыми: чёрный/белый, красный/синий, прозрачный/непрозрачный — главное, что выбор ограничен двумя элементами. В документной графике, факсимильной связи, сканировании текста такие изображения преобладают.

Благодаря минимальной энтропии (малому количеству возможных состояний), бинарные изображения обладают высокой степенью сжимаемости. Эффективность достигается за счёт повторяемости длинных серий одинаковых пикселей (например, белого фона на странице). Поэтому для них разработаны специализированные алгоритмы:

  • RLE (Run-Length Encoding) — заменяет последовательности одинаковых значений на пару (длина, значение). Прост, быстр, но неэффективен при шуме.
  • PackBits — вариант RLE, используемый в формате TIFF и Photoshop; поддерживает как повторяющиеся, так и неповторяющиеся отрезки.
  • CCITT Group 3 и Group 4 — стандарты ITU-T для факсимильной передачи. Group 3 работает построчно (1D-кодирование), Group 4 — межстрочно (2D-кодирование), что позволяет кодировать горизонтальные и вертикальные корреляции. Group 4 в среднем даёт выигрыш в 2–4 раза по сравнению с Group 3.
  • JBIG и JBIG2 — более современные стандарты. JBIG2 поддерживает сжатие на основе геометрии и символьное сжатие: одинаковые символы (например, буква «о» в тексте) кодируются один раз, а в изображении хранятся только их позиции и трансформации. Это особенно эффективно для машинно-печатных или рукописных документов.

Бинарные изображения широко применяются как конечный продукт и как промежуточное представление в системах обработки:

  • как маски (например, выделение объекта на фоне),
  • в математической морфологии (операции эрозии, дилатации, скелетизации),
  • в геоинформационных системах (булевы операции над зонами: пересечение, объединение, вычитание),
  • в оптическом распознавании символов (OCR) — после бинаризации текста.

5.2. Полутоновые (grayscale) изображения

Полутоновые изображения кодируют яркость пикселя без учёта цвета. Каждый пиксель представлен одним числом — уровнем серого. Типичная глубина — 8 бит (256 оттенков), но встречаются и 10-, 12-, 16-битные варианты (в медицинской или астрономической визуализации).

Полутоновое изображение — это не просто «чёрно-белая фотография». Это полноценная модель интенсивности света. Даже при 8 битах человеческий глаз способен различить тончайшие градиенты, если изображение грамотно калибровано и отображается на качественном мониторе.

Примечательно, что полутоновое изображение может быть преобразовано в бинарное методом пороговой обработки (thresholding) — назначением граничного значения, ниже которого пиксели считаются «чёрными», выше — «белыми». Но выбор порога критичен: при неоднородной освещённости (тенях, бликах) простой глобальный порог даёт искажённые результаты. Поэтому используют адаптивные методы (например, Ниблэка, Сауволы), рассчитывающие порог локально для каждой области.

5.3. Цветные индексированные изображения

В этой модели каждый пиксель хранит индекс в таблице цветов — палитре. Например, 8-битный пиксель может ссылаться на любой из 256 цветов, заранее определённых в палитре. Сама палитра обычно представлена как массив RGB-троек (или других цветовых компонент).

Такой подход эффективен, когда изображение содержит ограниченное число цветов — например, логотипы, иконки, старые видеоигры (16-цветный режим EGA, 256-цветный VGA). При этом:

  • объём данных на пиксель минимален (1, 2, 4 или 8 бит),
  • цвета могут быть оптимизированы под конкретное изображение (adaptive palette),
  • возможно использование прозрачности (один индекс зарезервирован как «прозрачный»).

Однако при попытке представить фотографию в индексированном формате возникает постеризация — искусственное «ступенчатое» разделение градиентов, поскольку плавные переходы заменяются скачками между ближайшими цветами палитры. Для смягчения применяют дизеринг — псевдослучайное распределение соседних цветов, чтобы создать иллюзию промежуточного оттенка за счёт мелкомасштабного смешения (например, шахматный узор из красного и жёлтого «выглядит» оранжевым на расстоянии).

5.4. Полноцветные (truecolor) изображения

Наиболее распространённый тип сегодня. Каждый пиксель кодирует все компоненты цвета независимо. Стандартная модель — RGB (красный, зелёный, синий), по 8 бит на канал (24 бита на пиксель). Это даёт 16,7 млн возможных цветов — достаточное количество для субъективно плавного восприятия.

Распространённые варианты:

  • RGBA — RGB + альфа-канал (прозрачность), 32 бита/пиксель.
  • 16-битный RGB (по 5-6-5 бит на канал) — компактный вариант, использовался в ранних графических ускорителях.
  • 48-битный RGB (по 16 бит на канал) — для профессиональной фотографии и цветокоррекции, позволяет избежать полос на градиентах при обработке.
  • CMYK — используется в полиграфии (голубой, пурпурный, жёлтый, чёрный); обычно 32 бита/пиксель (по 8 бит на канал), но возможны и другие глубины.

Важно: RGB — это устройственно-зависимая модель. Один и тот же RGB-код может выглядеть по-разному на разных мониторах, если они не профилированы. Для точной передачи цвета используется цветовое пространство (sRGB, Adobe RGB, ProPhoto RGB) и профили ICC, хранящие характеристики устройства.


6. Хранение и сжатие растровых данных

Растровые файлы редко хранятся «в сыром виде» (raw), поскольку это неэффективно по объёму. Даже без сжатия применяется упаковка (например, выравнивание строк до кратности 4 байтам в BMP), но главное — алгоритмы сжатия.

Существует два принципиальных подхода:

6.1. Сжатие без потерь (lossless)

Исходные данные могут быть восстановлены дословно. Применяется там, где недопустимы искажения: медицина, архивирование, документация, передача данных по каналам с проверкой контрольных сумм.

Алгоритмы:

  • LZW (Lempel–Ziv–Welch) — используется в GIF, TIFF. Строит словарь повторяющихся последовательностей «на лету».
  • Deflate — комбинация LZ77 и кода Хаффмана; лежит в основе PNG, ZIP, gzip.
  • FLIF, FELICS, JPEG-LS — более современные, ориентированные на изображения, особенно на градиенты и медицинские снимки.

6.2. Сжатие с потерями (lossy)

Жертвует точностью ради радикального уменьшения объёма. Человеческое зрение менее чувствительно к некоторым типам искажений (высокочастотный шум, мелкие детали в тенях), и алгоритмы этим пользуются.

Ключевой пример — JPEG (Joint Photographic Experts Group):

  • Изображение преобразуется из RGB в цветовое пространство YCbCr (яркость + два цветоразностных канала),
  • Каналы субдискретизируются (цветовая информация хранится с меньшим разрешением — 4:2:0, 4:2:2),
  • Данные разбиваются на блоки 8×8,
  • Каждый блок проходит дискретное косинусное преобразование (DCT), переводя информацию из пространственной области в частотную,
  • Коэффициенты DCT квантуются (малозначимые — обнуляются),
  • Квантованные коэффициенты кодируются (обычно RLE + код Хаффмана).

Важно: JPEG — это метод сжатия, а не формат. Формат JPEG обычно подразумевает JFIF или Exif-обёртку. И Exif (Exchangeable Image File Format) — отдельная важная тема.

6.3. Метаданные и Exif

Современные растровые файлы (особенно JPEG, TIFF) содержат пиксельные данные и служебную информацию:

  • дата и время съёмки,
  • модель и настройки камеры (выдержка, диафрагма, ISO, фокусное расстояние),
  • географические координаты (если GPS включён),
  • описание автора, копирайт,
  • ориентация (для корректного отображения портретных фото),
  • цветовой профиль (sRGB, Adobe RGB и др.),
  • миниатюра (thumbnail) для быстрого предпросмотра.

Эти данные организованы в структурированные блоки (IFD — Image File Directory в TIFF), а Exif — это расширение TIFF-формата, стандартизированное JEITA. Наличие метаданных крайне полезно для каталогизации, но может быть угрозой приватности (геотеги), поэтому их часто удаляют перед публикацией.


7. Растеризация в графическом конвейере

Растровая графика — это формат хранения и финальный этап рендеринга в реальном времени. В 3D-графике изображение создаётся через графический конвейер — последовательность этапов, преобразующих геометрическое описание сцены в растровый кадр.

Типичный конвейер (в упрощённой, но содержательной формулировке):

  1. Задание геометрии — сцена описывается как набор вершин и примитивов (треугольников, линий, точек).
  2. Вершинный шейдер — программа, выполняемая для каждой вершины. Вычисляет окончательную позицию в пространстве экрана, а также передаёт атрибуты (цвет, нормаль, UV-координаты) на последующие этапы.
  3. Сборка примитивов — вершины группируются в треугольники (или другие фигуры); выполняется отсечение невидимых частей (frustum culling, backface culling).
  4. Растеризация — ключевой этап, связывающий векторное описание с растровым выводом. Треугольники преобразуются в набор фрагментов — кандидатов в пиксели. Для каждого фрагмента определяется, попадает ли он внутрь треугольника, и вычисляются интерполированные атрибуты (например, UV-координаты для текстурирования).
  5. Фрагментный (пиксельный) шейдер — программа, вычисляющая окончательный цвет каждого фрагмента. На этом этапе применяются текстуры, освещение, тени, постобработка. Именно здесь формируется цвет пикселя.
  6. Тесты и запись — перед записью в буфер кадра фрагмент проходит:
    • Z-тест (глубинный буфер) — проверка, не закрыт ли он более близким объектом,
    • Stencil-тест — маскирование по сложным шаблонам (например, трафареты),
    • Blend-операции — смешивание с уже записанным цветом (для прозрачности),
    • Alpha-тест — отбрасывание полностью прозрачных фрагментов.

Таким образом, растеризация — это строго регламентированный процесс дискретизации геометрии с учётом пространственных и визуальных свойств сцены.


8. Текстуры и mipmapping

Текстура — это растровое изображение, накладываемое на 3D-поверхность для детализации. Но процесс отображения не тривиален:

  • UV-координаты задают, как 2D-карта (текстура) «оборачивается» вокруг 3D-меша. Нарушения в UV-развёртке ведут к искажениям (растяжениям, разрывам).
  • При удалении объекта от камеры один пиксель экрана может покрывать десятки или сотни текселей (пикселей текстуры). Прямая выборка одного текселя даёт шум и мерцание (алиасинг).

Решение — mipmapping. Это предварительно рассчитанный набор уменьшенных копий текстуры (mip-уровни), обычно в геометрической прогрессии (1/2, 1/4, 1/8 и т.д.). При рендеринге выбирается уровень, наиболее соответствующий проекционному масштабу. Это:

  • устраняет шум при мелкомасштабном отображении,
  • повышает кэш-эффективность (меньшие текстуры лучше помещаются в кэш GPU),
  • снижает потребление памяти пропускной способности.

Mipmapping — яркий пример того, как растровая графика адаптируется к динамическим условиям, сохраняя качество и производительность.


9. Веб-графика и Canvas 2D

В веб-разработке растровая графика реализована через элемент <canvas> с API Canvas 2D. Это не DOM-узел, а буфер пикселей, в который можно рисовать программно:

  • примитивы (линии, прямоугольники, окружности),
  • изображения (вставка из <img> или другого <canvas>),
  • текст,
  • градиенты и паттерны,
  • трансформации (повороты, масштабы, сдвиги),
  • составные операции (наложение, тени, альфа-смешение).

Canvas 2D подходит для задач, где важна гибкость и контроль: диаграммы, простые игры (2D), визуальные редакторы, анимации в реальном времени. Однако он не предоставляет сцены, иерархии объектов или автоматической оптимизации — всё управление состоянием лежит на разработчике.

Важно: содержимое <canvas> не индексируется поисковыми системами, не доступно для скринридеров, не реагирует на события, если не добавлены обработчики вручную. Это «слепой» растровый холст — эффективный, но требующий сопровождения доступности отдельно.


11. Форматы растровых файлов

Формат файла — это не просто «обёртка» вокруг пиксельных данных. Это спецификация, определяющая:

  • как организованы заголовок, метаданные и тело,
  • какие цветовые модели и глубины поддерживаются,
  • какие алгоритмы сжатия допустимы,
  • присутствует ли поддержка прозрачности, анимации, слоёв,
  • совместим ли формат с конкретными устройствами, ОС, веб-стандартами.

Выбор формата влияет на качество, размер, скорость загрузки, безопасность и долговечность изображения. Рассмотрим ключевые форматы в хронологическом и функциональном порядке.


11.1. BMP (Bitmap File Format) — эталон простоты

BMP — один из старейших и наиболее прямолинейных форматов, разработанный Microsoft в середине 1980-х для операционной системы Windows. Его архитектура отражает принципы ранних графических интерфейсов: минимум обработки, максимум прямого доступа к памяти видеокарты.

Структура файла:

  • Заголовок файла (14 байт) — сигнатура BM, общий размер, смещение до начала пиксельных данных.
  • Заголовок изображения (DIB header) — от 40 до 124+ байт, в зависимости от версии. Содержит:
    • ширина и высота (в пикселях),
    • количество цветовых плоскостей (всегда 1),
    • битовая глубина (1, 4, 8, 16, 24, 32),
    • метод сжатия (обычно BI_RGB — без сжатия, реже BI_RLE8/BI_RLE4),
    • разрешение по горизонтали/вертикали (в PPI, для печати),
    • количество используемых и важных цветов (для индексированных изображений).
  • Цветовая таблица (палитра) — присутствует только при глубине ≤ 8 бит. Каждая запись — 4 байта (B, G, R, reserved).
  • Пиксельные данные — хранятся снизу вверх (нижняя строка — первая в потоке), построчно, с выравниванием каждой строки до кратности 4 байтам (для эффективного доступа процессором). Это так называемое row padding.

Достоинства BMP:

  • полностью документирован, открыт, тривиален в реализации,
  • поддерживается всеми ОС и графическими библиотеками «из коробки»,
  • не требует декодирования — данные почти напрямую маппятся в видеопамять.

Недостатки:

  • отсутствие эффективного сжатия (RLE малоэффективен для фотографий),
  • большой объём,
  • отсутствие поддержки метаданных (Exif, ICC-профили),
  • нет прозрачности в 24-битной версии (только в 32-битной — через альфа-канал, но поддержка в приложениях исторически слабая).

Где используется сегодня?
В основном — в системном ПО (иконки, заставки Windows), в образовательных целях (демонстрация raw-данных), в embedded-системах, где важна скорость декодирования и отсутствие зависимостей. Не подходит для веба или хранения фото.


11.2. GIF (Graphics Interchange Format) — анимация и ограничения цвета

GIF появился в 1987 году от CompuServe как ответ на потребность в компактном, переносимом формате для обмена графикой в раннем интернете. Его главные инновации — LZW-сжатие без потерь и поддержка прозрачности и анимации.

Ключевые характеристики:

  • Максимум 256 цветов (8-битная палитра).
  • Поддержка глобальной и локальных палитр: вся анимация может использовать одну палитру, либо каждый кадр — свою.
  • Прозрачность — один индекс в палитре объявляется прозрачным (один уровень, без полупрозрачности).
  • Анимация — реализована через расширение Application Extension («NETSCAPE2.0»), задающее количество повторов, и Graphic Control Extension перед каждым кадром (задержка, метод отрисовки: replace/restore).
  • LZW-сжатие — эффективно для изображений с большими одноцветными областями (логотипы, схемы), но плохо справляется с градиентами и шумом.

Исторически важен патентный спор: LZW был запатентован Unisys, что в 1990-х привело к лицензионным платежам за использование GIF и стимулировало создание альтернатив (PNG).

Где используется сегодня?

  • Мемы, простые анимации в соцсетях,
  • Загрузочные индикаторы (из-за широкой поддержки),
  • Документация, где нужна анимация без звука и с гарантированной поддержкой даже в старых браузерах.

Не используйте GIF для:

  • Фотографий (постеризация неизбежна),
  • Изображений с плавными градиентами,
  • Случаев, где нужна альфа-прозрачность (полупрозрачность).

11.3. PNG (Portable Network Graphics) — ответ на GIF и TIFF

PNG был разработан в 1995–1996 гг. как открытая, патентно-чистая альтернатива GIF и TIFF. Основан на опыте формата gzip и zlib, с акцентом на надёжность, переносимость и гибкость.

Структура PNG — поток блоков (chunks). Каждый чанк имеет:

  • 4-байтную длину данных,
  • 4-символьное имя (например, IHDR, IDAT, IEND),
  • данные,
  • 4-байтную CRC-32 для проверки целостности.

Обязательные чанки:

  • IHDR — заголовок: ширина, высота, битовая глубина (1, 2, 4, 8, 16), цветовой тип (0 — grayscale, 2 — RGB, 3 — indexed, 4 — grayscale+alpha, 6 — RGB+alpha), метод сжатия (только deflate), фильтрация, интерлейсинг.
  • IDAT — один или несколько блоков сжатых пиксельных данных.
  • IEND — маркер конца.

Процесс кодирования:

  1. Фильтрация строк — перед сжатием к каждой строке применяется один из 5 предикторов (None, Sub, Up, Average, Paeth), чтобы уменьшить энтропию (например, заменить 128, 129, 130 на 128, +1, +1).
  2. Сжатие Deflate — LZ77 + код Хаффмана.

Возможности PNG:

  • Глубина до 16 бит на канал (48 бит RGB, 64 бит RGBA),
  • Полная альфа-прозрачность (включая градиенты),
  • Гамма-коррекция и цветовые профили через чанки gAMA, cHRM, iCCP,
  • Текстовые комментарии (tEXt, zTXt, iTXt),
  • Интерлейсинг Adam7 — 7 проходов, позволяющих загружать изображение постепенно (очень низкое → высокое разрешение).

Где используется:

  • Иконки, скриншоты, схемы, диаграммы (где важна резкость и прозрачность),
  • Графика для веб-интерфейсов (вместо GIF),
  • Промежуточное хранение в графических редакторах (GIMP, Krita),
  • Тестирование (благодаря lossless-гарантии).

Ограничения:

  • Медленнее JPEG по скорости кодирования/декодирования,
  • Значительно больше по объёму для фотографий,
  • Анимация (APNG) поддерживается не везде (хотя сейчас — почти везде, кроме некоторых почтовых клиентов).

11.4. JPEG (Joint Photographic Experts Group) — стандарт фотографии

JPEG — метод сжатия. Реализации обычно используют обёртки JFIF (JPEG File Interchange Format) или Exif.

Как уже отмечалось, JPEG:

  • Ориентирован на естественные изображения (фотографии), где допустимы небольшие искажения,
  • Использует цветовое пространство YCbCr и субдискретизацию цвета,
  • Применяет DCT + квантование + энтропийное кодирование.

Важные нюансы:

  • Progressive JPEG — вместо построчного отображения (baseline) изображение загружается «размытым → чётким». Это достигается за счёт упорядоченного хранения коэффициентов DCT — сначала грубые (низкие частоты), потом детали (высокие). Улучшает восприятие при медленной загрузке.
  • Arithmetic coding — альтернатива Huffman-кодированию, даёт ~5–10% выигрыша, но был патентован и почти не используется.
  • Restart markers — позволяют восстанавливать изображение после повреждения (например, при обрыве связи).

Качество vs. размер:
Пользователь задаёт коэффициент качества (обычно 1–100). На самом деле это масштабирование таблицы квантования — чем ниже значение, тем сильнее обнуляются высокочастотные коэффициенты. При Q < 80 артефакты (блоки, звон по границам, цветовой шум) становятся заметными.

Где нельзя использовать JPEG:

  • Текст, схемы, логотипы (теряется резкость, появляются ложные края),
  • Изображения с прозрачностью (JPEG не поддерживает альфа-канал),
  • Многократное редактирование (каждое сохранение добавляет потери — generation loss).

Для избежания generation loss при редактировании фото используют:

  • RAW-форматы (CR2, NEF, DNG) — «цифровой негатив» с необработанными данными сенсора,
  • TIFF с LZW — lossless-хранение промежуточных версий.

11.5. TIFF (Tagged Image File Format) — контейнер для профессионалов

TIFF — это гибкий фреймворк для хранения растровых данных. Разработан Aldus (позже Adobe) в 1986 г. как универсальный стандарт для настольных издательских систем.

Ключевая идея — теги (tags). Файл состоит из одного или нескольких IFD (Image File Directories) — словарей «тег → значение». Каждый IFD описывает одно изображение (или один слой, страницу, mip-уровень).

Примеры тегов:

  • ImageWidth, ImageLength,
  • BitsPerSample, SamplesPerPixel,
  • Compression (1 = none, 2 = CCITT G3, 5 = LZW, 6 = JPEG, 7 = PackBits, 32773 = CCITT G4, 34676 = SGI Log Luv и др.),
  • PhotometricInterpretation (RGB, CMYK, YCbCr, палитра и т.п.),
  • XResolution, YResolution,
  • Artist, Copyright, DateTime,
  • Exif IFD, GPS IFD, Interoperability IFD — вложенная структура для Exif.

Возможности:

  • Многостраничность (сканы документов),
  • Многослойность (через частные теги, например, Photoshop),
  • Поддержка любых глубин (1, 2, 4, 8, 16, 32 бит), цветовых моделей, схем сжатия,
  • BigTIFF — расширение для файлов > 4 ГБ (смещения 64-битные).

Где используется:

  • Архивирование (библиотеки, музеи),
  • Полиграфия (CMYK, профили ICC),
  • Научная визуализация (микроскопия, астрономия — 16/32-битные каналы),
  • ГИС (геопривязка через теги ModelTiepointTag, ModelPixelScaleTag).

Недостаток: сложность реализации — многие читатели поддерживают только «подмножество TIFF», особенно если используют редкие схемы сжатия (JPEG-in-TIFF с цветовым пространством, отличным от YCbCr, часто ломает парсеры).


11.6. WebP — формат нового поколения для веба

WebP разработан Google в 2010 г. на основе видеокодека VP8. Цель — заменить JPEG, PNG и GIF в веб-среде, обеспечив меньший размер при равном или лучшем качестве.

Два режима:

  • Lossy — на основе предсказания внутри блока (как VP8), с преобразованием (DCT-like), квантованием, энтропийным кодированием. Поддерживает альфа-канал (отдельно сжимаемый lossless), метаданные XMP/EXIF.
  • Lossless — комбинация цветового преобразования (например, предсказание зелёного из красного), копирования блоков, кода Хаффмана и обратимого преобразования цвета.

Ключевые преимущества:

  • На 25–35% меньше размера по сравнению с JPEG при том же PSNR/SSIM,
  • Альфа-прозрачность (в отличие от JPEG),
  • Анимация (WebP-анимация заменяет GIF с ~60% экономией),
  • Поддержка метаданных.

Поддержка:

  • Chrome, Firefox, Edge, Safari (с 14 версии) — полная,
  • iOS/Android — встроенная поддержка в системных API,
  • Конвертация через cwebp/dwebp (из libwebp).

Ограничения:

  • Медленнее кодирование, чем JPEG,
  • Меньше инструментов для ручной тонкой настройки (по сравнению с JPEG),
  • Не все CMS/хостинги автоматически конвертируют в WebP.

11.7. AVIF и JPEG XL — будущее сжатия

Эти форматы представляют следующее поколение — основанное на современных видеокодеках и психовизуальных моделях.

AVIF (AV1 Image File Format)
  • Основан на AV1 (Alliance for Open Media),
  • Поддержка: lossy, lossless, альфа, HDR, wide gamut, анимация, тайловая декомпрессия,
  • Экономия: ~50% по сравнению с JPEG при том же качестве (по данным Netflix, AOM),
  • Использует матричное квантование, палитры, глобальное предсказание,
  • Поддержка в Chrome, Firefox, Android 12+, Safari 16.4+.
JPEG XL
  • Разработан Google и сторонними экспертами,
  • Цель: замена JPEG с обратной совместимостью (можно встроить JPEG-поток в JXL, а при открытии в старом ПО — извлечь его),
  • Поддержка lossy и lossless в одном кодеке,
  • Очень быстрое декодирование,
  • Эффективен как для фото, так и для графики (линии, текст),
  • Пока ограниченная поддержка (Firefox — в about:config, Chrome — отключён из-за споров с патентами), но потенциально перспективен для долгосрочного хранения.

12. Выбор формата

СценарийРекомендуемый форматПочему
Фотография для вебаAVIF → WebP → JPEGAVIF — лучшее сжатие; WebP — хороший баланс поддержки/размера; JPEG — fallback
Иконка, логотип, схемаSVG (вектор) → PNGЕсли масштабирование критично — SVG; если нужна растровая точность — PNG-24/32
Анимация без звукаAVIF (аним.) → WebP (аним.) → GIFAVIF/WebP — меньший размер; GIF — только для максимальной совместимости
Архив, редактированиеTIFF (LZW/ZIP) или PNGLossless, поддержка метаданных, многослойность (в TIFF)
Документы (сканы)TIFF (G4) или DjVu/PDFCCITT G4 — оптимален для ч/б текста; DjVu — лучше для цветных сканов с текстом
Мобильные приложенияWebP (lossy/lossless)Экономия трафика и памяти, встроенная поддержка в Android/iOS
HDR / широкий цветовой охватAVIF, HEIF, OpenEXRПоддержка 10/12-бит, PQ/HLG, BT.2020

13. Безопасность и обработка форматов

Растровые форматы — не «безопасные данные». История знает десятки уязвимостей в парсерах:

  • Повреждённые заголовки (переполнение буфера при выделении памяти),
  • Бесконечные циклы в LZW (GIF),
  • Целочисленные переполнения при расчёте размера строки (BMP, PNG),
  • RCE через вредоносные чанки (TIFF, PNG).

Поэтому в production-средах:

  • Всегда валидируйте изображения (например, через libvips, Pillow, ImageMagick с policy.xml),
  • Не доверяйте метаданным (Exif может содержать скрипты в тегах UserComment),
  • Конвертируйте загружаемые файлы в «безопасный» формат (например, JPEG → JPEG с пересжатием),
  • Ограничьте максимальное разрешение и объём.

14. Растровая графика в ГИС

В ГИС растровые данные — одна из двух фундаментальных моделей представления пространственной информации (наряду с векторной). Их применение выходит далеко за рамки «картинки на подложке»: растры служат количественными полями, спектральными измерениями, моделями поверхности, масками классификации и интермедийными продуктами анализа.

Самый наглядный и исторически первый пример — скан бумажной карты. Внешне это обычное изображение (например, PNG или JPEG), но для ГИС оно становится пространственно осмысленным объектом лишь после процедуры геопривязки (геореференцирования). Без неё файл — просто рисунок, не привязанный к координатам Земли.

14.1. Геопривязка

Геопривязка — это установление соответствия между координатами пикселя в растровом файле (столбец x, строка y) и географическими или проекционными координатами точки на поверхности Земли (X, Y в метрах или градусах).

Формально это задаётся аффинным преобразованием (хотя в публикации мы опускаем формулы, суть его можно выразить словами):

Положение любого пикселя определяется линейной комбинацией: известна координата левого верхнего угла, шаг по горизонтали (размер пикселя по X), шаг по вертикали (по Y), и возможен наклон (угол поворота осей).

Для большинства сканированных карт (ортофотопланов, топографических листов) используется упрощённая модель — прямоугольная решётка без искажений (т.е. оси X и Y пиксельной сетки параллельны осям координатной системы, и масштаб одинаков по обеим осям или различается, но без сдвига).

Ключевые параметры, которые необходимо указать:

  • Опорные точки (GCP — Ground Control Points) — пары: (пиксель x₁, y₁) ↔ (координата X₁, Y₁). Минимум — 3 точки для аффинного преобразования (2 — для масштаба + смещения, но без контроля искажений). Чем точнее и равномернее распределены точки по листу, тем выше качество привязки.
  • Координатная система (CRS — Coordinate Reference System) — например, WGS84 (EPSG:4326) для географических координат, или UTM Zone 40N (EPSG:32640) для метрической проекции.
  • Разрешение по земле (GSD — Ground Sample Distance) — расстояние на местности, приходящееся на один пиксель. Например, 0,5 м/пиксель означает, что один пиксель на изображении соответствует участку земли 0,5 × 0,5 метра. Это критически важно для интерпретации масштаба и точности.

Результат геопривязки сохраняется либо:

  • в виде отдельного файла (например, .tfw для TIFF — world file),
  • во встроенных метаданных (например, теги ModelTiepointTag и ModelPixelScaleTag в GeoTIFF),
  • в базе данных (например, PostGIS Raster).

GeoTIFF — это профиль TIFF, стандартизированный OGC (Open Geospatial Consortium). Он расширяет базовый TIFF набором тегов для геопространственных данных:

  • GeoKeyDirectoryTag — структура, аналогичная IFD, для хранения CRS (включая PROJ.4-строки),
  • GeoDoubleParamsTag, GeoAsciiParamsTag — дополнительные параметры проекции,
  • ModelTransformationTag — полноценная 4×4 матрица для произвольных преобразований (включая 3D),
  • поддержка масок (per-pixel validity), диапазонов (min/max для визуализации), единиц измерения (метры, футы, сантиметры).

GeoTIFF стал де-факто стандартом для обмена растровыми ГИС-данными благодаря своей открытости, гибкости и поддержке во всех профессиональных системах (QGIS, ArcGIS, GDAL, ERDAS).


14.2. Особенности растров в ГИС

В ГИС растровое изображение — это многомерный массив чисел, где каждый пиксель (точнее, ячейка или воксел в 3D) несёт значение физической величины:

Тип данныхПримеры значенийЕдиницы измеренияПрименение
Высота125.7, −3.2метры (над уровнем моря)ЦМР (цифровая модель рельефа), гидрологический анализ
Температура283.15кельвиныМетеорология, климатическое моделирование
Индекс растительности (NDVI)−1.0 … +1.0безразмерныйМониторинг сельского хозяйства, экологии
Класс покрытия0=вода, 1=лес, 2=полекод категорииТематическое картографирование
Плотность населения1537чел/км²Социально-экономический анализ
Вероятность0.870.0–1.0Оценка рисков (оползни, наводнения)

Это означает, что:

  • Глубина цвета часто не 8 бит, а 16, 32 целых или 32/64 бит с плавающей точкой (float32, float64),
  • Цветовое отображение — условное: палитра или градиент назначается после загрузки для визуализации (например, синий → холодно, красный → жарко),
  • Отсутствует «цвет» как таковой — значения могут быть отрицательными, дробными, выходить за диапазон 0–255.

Такие данные называют георастрами (georasters) или растровыми покрытиями (raster coverages) — термин, закреплённый в стандартах OGC (например, WCS — Web Coverage Service).


14.3. Проблемы масштаба и их решения

Одиночный растр, покрывающий регион или страну, может достигать сотен гигабайт. Прямая загрузка в память невозможна. ГИС-системы используют иерархические и распределённые стратегии.

14.3.1. Пирамиды (overviews, pyramids)

Это набор уменьшенных копий исходного растра, предварительно рассчитанных на разных масштабах. При отдалении камеры система автоматически переключается на соответствующий уровень пирамиды.

Ключевые особенности:

  • Уровни строятся с коэффициентом 2 (1:1, 1:2, 1:4, 1:8…),
  • Пересчёт выполняется с учётом семантики данных:
    • для изображений — билинейная или ланцошева интерполяция,
    • для категориальных данных (классы) — модальное значение (наиболее частый класс в блоке),
    • для непрерывных полей (высота) — среднее или билинейное,
  • Пирамиды могут храниться:
    • внутри того же файла (внутренние овервью в GeoTIFF, через GDAL_STRUCTURAL_METADATA),
    • в отдельных файлах (например, .ovr),
    • в базе (PostGIS Raster, Oracle GeoRaster).
14.3.2. Тайловые системы (tiled raster datasets)

Вместо одного гигантского файла растр разбивается на плитки (tiles) фиксированного размера (обычно 256×256 или 512×512 пикселей). Это позволяет:

  • загружать только видимую область,
  • распределять хранение по серверам (CDN),
  • кэшировать часто запрашиваемые тайлы.

Примеры:

  • TMS (Tile Map Service) — простой протокол: /{z}/{x}/{y}.png, где z — уровень зума, x, y — координаты тайла в глобальной сетке,
  • WMTS (Web Map Tile Service) — стандарт OGC, расширяющий TMS метаданными и поддержкой CRS,
  • MBTiles — SQLite-база, хранящая тайлы + метаданные (используется в мобильных приложениях),
  • Cloud Optimized GeoTIFF (COG) — GeoTIFF с внутренней тайловостью и пирамидами, оптимизированный для чтения по HTTP range-запросам («читай только нужный байт-диапазон»).

COG — прорыв: позволяет работать с терабайтными растрами напрямую из облака (S3, GCS), без предварительной загрузки.

14.3.3. Мозаики (mosaics)

Когда данных слишком много для одного файла (например, съёмка всей страны за год), их объединяют в виртуальную мозаику — логический слой, который динамически выбирает нужные фрагменты.

Инструменты:

  • VRT (Virtual Raster) — XML-описание в GDAL: «возьми файл A (ограничение по координатам), поверх него — B, в прозрачных областях — C…». Не копирует данные, работает «на лету».
  • Mosaic Dataset (ArcGIS) — хранилище метаданных в геодатабазе, поддерживающее правила наложения, временные фильтры, уровень качества.
  • STAC (SpatioTemporal Asset Catalog) — современный open-стандарт для описания коллекций геоданных с временной и пространственной привязкой. Позволяет искать и комбинировать растры по дате, облакам, спектральным индексам.

Мозаика даёт возможность, например, построить «бесоблачный композит» за месяц: для каждой точки брать пиксель из снимка с минимальной облачностью.


14.4. Специфические типы растровых ГИС-данных

14.4.1. Ортофотопланы (orthophoto)

Фотографии местности, скорректированные так, чтобы масштаб был постоянным по всему изображению (как у карты). Обычное аэрофотоискажено перспективой: ближние объекты крупнее, крыши зданий «завалены». Ортотрансформация устраняет это с помощью ЦМР и фотограмметрической обработки.

Характеристики:

  • Высокое разрешение (0,1–0,5 м),
  • Часто 4-канальные: R, G, B, NIR (ближний инфракрасный),
  • Используются как подложка для векторного картирования.
14.4.2. Цифровые модели рельефа (ЦМР, DEM — Digital Elevation Model)

Двумерный массив высот. Различают:

  • DSM (Digital Surface Model) — высоты поверхности (включая здания, деревья),
  • DTM (Digital Terrain Model) — высоты земли (без объектов),
  • DHM (Digital Height Model) — разность DSM и DTM (высота объектов).

ЦМР — основа для анализа:

  • уклонов и экспозиций,
  • водосборных бассейнов и направлений стока (flow direction, accumulation),
  • видимости (line-of-sight, viewshed analysis),
  • 3D-визуализации (трассировка лучей, тени).
14.4.3. Много- и гиперспектральные снимки

Если RGB — 3 канала, то:

  • Мультиспектральные — 4–15 каналов (Landsat: 11, Sentinel-2: 13),
  • Гиперспектральные — сотни узких каналов (AVIRIS: 224 канала).

Каждый канал — отдельный растр (или слой в многоканальном файле). Анализ основан на спектральных сигнатурах — уникальных «отпечатках» материалов в разных диапазонах (например, хлорофилл сильно отражает NIR, вода поглощает SWIR).

Обработка требует:

  • радиометрической калибровки (DN → отражательная способность),
  • атмосферной коррекции,
  • геометрической привязки,
  • классификации (машинное обучение: Random Forest, SVM, нейросети).

14.5. Ограничения растровой модели в ГИС и как с ними работают

ОграничениеПроблемаКомпенсация
Зависимость от разрешенияМелкие объекты теряются при низком GSDИспользование данных с разным разрешением («масштабно-зависимое моделирование»), фузия данных (например, панхроматический + мультиспектральный)
Объём данныхТерабайты на регионCOG, сжатие (Deflate, ZSTD, LERC), облачные хранилища, on-the-fly processing (Google Earth Engine, AWS EO)
«Лестничный» эффект границРезкие переходы между ячейкамиСубпиксельная классификация, сглаживание (но осторожно — не искажать количественные значения!)
Зависимость от CRSОшибки при конвертации проекцийИспользование единой CRS в проекте, строгая валидация трансформаций (PROJ, pyproj)
Смешанные пикселиОдин пиксель покрывает несколько объектов (например, дорога + лес)Спектральная неопределённость, soft classification, объектно-ориентированный анализ (segmentation + классификация сегментов)

14.6. Современные тенденции

  • Обработка в облаке — Google Earth Engine, Microsoft Planetary Computer, Sentinel Hub позволяют запускать анализ на петабайтах данных без загрузки.
  • ИИ в обработке — сегментация зданий (U-Net), классификация землепользования, восстановление облачных участков (GANs).
  • Интеграция с вектором — растровые вычисления (zonal statistics, raster calculator) + векторные атрибуты = мощный аналитический инструментарий.
  • Открытые данные — Copernicus (Sentinel), USGS EarthExplorer, Rosreestr Публичная кадастровая карта — бесплатные источники георастров.

15. Цифровая обработка изображений

Цифровая обработка изображений — это дисциплина, занимающаяся преобразованием растровых данных с целью улучшения визуального восприятия, извлечения признаков, подготовки к анализу или синтеза новых изображений. Её задачи делятся на три условные категории:

  1. Улучшение (enhancement) — сделать изображение удобнее для человека: повысить контраст, убрать шум, скорректировать цвет.
  2. Восстановление (restoration) — приблизить изображение к исходному состоянию до искажений (размытие, шум, сжатие).
  3. Анализ (analysis) — извлечь количественную информацию: границы объектов, текстуры, спектральные характеристики, классы.

Все методы работают с изображением как с двумерной функцией яркости $ I(x, y) $, где $ x, y $ — дискретные координаты пикселя, а $ I $ — его значение (от 0 до 255 для 8-битного grayscale, или вектор RGB). Ниже мы последовательно рассмотрим ключевые классы операций, избегая формул, но сохраняя строгость описания.


15.1. Поточечные (пиксельные) операции

Эти преобразования зависят только от значения текущего пикселя, не от соседей. Они реализуются через таблицу соответствий (LUT — Look-Up Table): для каждого возможного входного значения задаётся выходное.

15.1.1. Линейные преобразования

Простейший случай — аффинное преобразование яркости:

Новое значение = коэффициент усиления × исходное значение + смещение.

На практике это:

  • Коррекция яркости — добавление константы ко всем пикселям (смещение). При переполнении значения «зажимаются» до максимума (255), что приводит к потере деталей в светах.
  • Контраст — изменение коэффициента усиления. Коэффициент > 1 растягивает диапазон (повышает контраст), < 1 — сжимает (снижает).
  • Инверсия — частный случай: новое = 255 − старое. Используется для негативов или улучшения читаемости при определённых условиях освещения.

Важно: линейные операции не меняют распределение значений — только масштаб и сдвиг. Для изменения формы распределения нужны нелинейные методы.

15.1.2. Нелинейные преобразования

Здесь выходное значение — нелинейная функция входного. Примеры:

  • Гамма-коррекция — компенсация нелинейной характеристики отображения. Мониторы исторически имели зависимость яркости ≈ напряжение^2.2. Чтобы изображение выглядело «правильно», данные кодируются с γ < 1 (например, sRGB использует γ ≈ 0.45), а монитор применяет γ ≈ 2.2 при воспроизведении. Операция:
    > I_out = I_in^γ
    При γ < 1 — усиление теней, при γ > 1 — усиление светов.

  • Логарифмическое преобразование — сжатие динамического диапазона. Полезно, когда сцена содержит очень яркие и очень тёмные участки (например, рентген, астрономия). Преобразует мультипликативные отношения в аддитивные.

  • Степенные функции (power-law) — обобщение гаммы. Используются в медицинской визуализации для акцента на определённых тканях.

15.1.3. Пороговая обработка (thresholding)

Преобразует полутоновое изображение в бинарное. Задаётся порог $ T $:

Если $ I(x, y) ≥ T $, то пиксель = 1 («объект»), иначе — 0 («фон»).

Проблема: выбор $ T $.

  • Глобальный порог — одно значение для всего изображения. Работает только при однородном освещении.
  • Адаптивный порог — $ T $ вычисляется локально для каждой области (например, как среднее + смещение в окне 15×15). Методы Ниблэка, Сауволы учитывают локальную дисперсию — эффективны для документов с тенями.
  • Метод Отсу — автоматический подбор $ T $, максимизирующий внутриклассовую дисперсию (т.е. делает фон и объект как можно более однородными). Подходит для бимодальных гистограмм.

Результат — бинарное изображение, используемое как маска для дальнейших операций (морфология, анализ формы).


15.2. Пространственные операции: оконные фильтры и свёртки

Здесь значение пикселя зависит от окрестности — прямоугольного окна (ядра) вокруг него. Операция называется свёрткой (convolution), хотя в обработке изображений часто используют корреляцию (без переворота ядра — разница несущественна для симметричных ядер).

Ядро — это малая матрица коэффициентов (например, 3×3, 5×5). Для каждого пикселя:

  1. Центрируем ядро на пикселе,
  2. Перемножаем значения пикселей окна на коэффициенты ядра,
  3. Суммируем результаты — получаем новое значение центрального пикселя.
15.2.1. Сглаживающие (low-pass) фильтры

Подавляют высокочастотные компоненты — шум, мелкие детали, резкие границы.

  • Усредняющий фильтр — все коэффициенты = 1/9 (для 3×3). Прост, но даёт «мыльный» эффект и сдвигает границы.
  • Гауссов фильтр — коэффициенты — значения двумерной гауссианы. Обеспечивает плавное затухание влияния дальних пикселей. Параметр — радиус (σ): чем больше σ, тем сильнее размытие.
  • Медианный фильтр — нелинейная операция: в окне сортируют значения, берут медиану. Отлично убирает импульсный шум («соль-перец»), сохраняя резкость границ.

Сглаживание — первый шаг в большинстве конвейеров: оно повышает устойчивость к шуму при последующем градиентном анализе.

15.2.2. Повышающие резкость (high-pass) и градиентные фильтры

Выделяют границы и мелкие детали — области с высокой пространственной частотой.

  • Фильтр Лапласа — дискретный аналог второй производной. Ядро вроде:

     0  1  0  
    1 -4 1
    0 1 0

    Реагирует на изолированные точки и резкие переходы. Часто добавляется к исходному изображению для повышения резкости (unsharp masking).

  • Операторы градиента (Собеля, Превитта, Робертса) — вычисляют приближение первой производной по X и Y.

Градиент — основа для алгоритмов детектирования границ (Canny, Marr-Hildreth).

15.2.3. Нестандартные ядра
  • Эмбосс (emboss) — имитирует объём: выделяет диагональные границы, делая одни края светлыми, другие — тёмными.
  • Условные фильтры — коэффициенты зависят от локальных характеристик (например, применяют гауссово размытие только в однородных областях, а вблизи границ — сохраняют резкость). Это основа нелинейных анизотропных фильтров (например, bilateral filter).

15.3. Морфологические операции

Работают только с бинарными (или полутоновыми) изображениями и основаны на теории множеств и геометрии. Используют структурный элемент (SE) — малая бинарная маска (например, крест, квадрат, диск), задающая форму «зонда».

15.3.1. Основные операции
  • Дилатация (расширение) — «растягивает» объекты. Пиксель становится 1, если хотя бы один пиксель SE, наложенного на него, совпадает с 1 в исходном изображении. Увеличивает объекты, заполняет впадины.
  • Эрозия (сжатие) — «сужает» объекты. Пиксель становится 1, только если все пиксели SE совпадают с 1. Уменьшает объекты, убирает тонкие выступы.
  • Открытие = эрозия + дилатация. Убирает мелкие объекты и выступы, сохраняя размер крупных.
  • Закрытие = дилатация + эрозия. Заполняет впадины и разрывы, не увеличивая объекты.
  • Градиент = дилатация − эрозия. Выделяет границу объекта как кривую постоянной ширины.
  • Скелетизация — последовательное применение эрозии с сохранением топологии. Превращает объект в «остов» — граф, сохраняющий форму. Используется в распознавании символов.
15.3.2. Применение в ГИС и техническом зрении
  • Удаление шума после бинаризации сканов карт,
  • Замыкание разрывов в контурах дорог или рек,
  • Анализ формы: площадь = количество пикселей, периметр = длина границы, компактность = 4π·площадь/периметр²,
  • Удаление «островов» (малых фрагментов, не соединённых с основным объектом).

15.4. Частотный анализ

Пока что все операции выполнялись в пространственной области (координаты x, y). Но изображение можно представить как сумму синусоид разной частоты, амплитуды и фазы — это частотная область.

Ключевой инструмент — дискретное преобразование Фурье (DFT). Оно отображает изображение в комплекснозначную функцию $ F(u, v) $, где $ u, v $ — пространственные частоты.

Свойства:

  • Низкие частоты ($ u, v ≈ 0 $) — общая освещённость, крупные формы,
  • Высокие частоты — мелкие детали, шум, границы,
  • Периодические структуры (муар, сканирующие линии) появляются как яркие точки в определённых позициях спектра.

Применение:

  • Фильтрация в частотной области — умножение спектра на маску:
    • НЧ-фильтр («затемнение» по краям) = сглаживание,
    • ВЧ-фильтр («затемнение» центра) = повышение резкости,
    • Полосовой фильтр — выделение структур заданного масштаба.
  • Удаление периодического шума — обнаружение «звёздочек» в спектре и их подавление.
  • Сжатие — JPEG использует DCT (близкое к DFT), сохраняя только значимые коэффициенты.

Обратное преобразование (IDFT) возвращает изображение в пространственную область — уже изменённое.


15.5. Сегментация

Сегментация — разделение изображения на семантически однородные области. Это один из самых сложных и активно исследуемых этапов.

15.5.1. Методы на основе порогов и гистограмм
  • Гистограмма — график распределения значений яркости. Бимодальность (два пика) часто указывает на два класса (объект/фон). Метод Отсу автоматизирует выбор порога между пиками.
  • Многопороговая сегментация — для трёх и более классов (например, в медицинских снимках: кость, мягкие ткани, воздух).
  • Адаптивные гистограммы — строятся локально (например, CLAHE — Contrast Limited Adaptive Histogram Equalization), чтобы избежать переконтраста в однородных областях.
15.5.2. Методы на основе границ
  • Алгоритм Кэнни — многоэтапный:
    1. Сглаживание гауссовым фильтром,
    2. Вычисление градиента (обычно Собелем),
    3. Подавление немаксимумов (оставляют только локальные максимумы градиента),
    4. Двойной порог + трассировка связных компонент — чтобы не было обрывов.
      Результат — тонкие, замкнутые контуры.
15.5.3. Методы на основе областей
  • Рост областей (region growing) — старт от «семян» (точек заведомо принадлежащих объекту), добавление соседей, похожих по яркости/текстуре.
  • Watershed (водораздел) — интерпретация изображения как рельефа: яркость = высота. Заливка «долин» приводит к сегментации по границам хребтов. Чувствителен к шуму — требует предварительного сглаживания или маркеров.
15.5.4. Современные методы
  • Граф-куты (Graph Cuts) — формулируют сегментацию как задачу минимизации энергии: гладкость границ + соответствие данных.
  • Свёрточные нейросети (U-Net, Mask R-CNN) — обучены на размеченных данных, дают пиксельно-точные маски. Требуют GPU и больших наборов данных, но достигают state-of-the-art качества.

15.6. Количественный анализ

После сегментации каждая область (компонент связности) становится объектом для измерения.

Стандартные метрики:

  • Площадь — количество пикселей, умноженное на площадь одного пикселя (из метаданных GSD),
  • Периметр — длина границы (с поправкой на диагональные шаги),
  • Центр масс — среднее по координатам,
  • Ориентация — угол главной оси инерции,
  • Эллиптичность — отношение осей эллипса, аппроксимирующего объект,
  • Текстурные признаки — на основе GLCM (Gray-Level Co-occurrence Matrix): контраст, корреляция, энергия, однородность.

В ГИС эти атрибуты заносятся в таблицу векторного слоя — завершая цикл «растр → вектор».


16. Растровая графика в машинном зрении и глубоком обучении

Машинное зрение (computer vision) и глубокое обучение (deep learning) радикально изменили подходы к анализу изображений. Однако фундамент остался неизменным: входные данные — по-прежнему массивы чисел, организованные в двумерные (или трёхмерные, при учёте каналов) структуры. Разница в том, что если классические методы обработки изображений опирались на явно заданные правила (фильтры, пороги, морфология), то нейросети извлекают правила из данных — но сам формат представления остаётся растровым.

16.1. Представление изображения как тензора

В глубоком обучении изображение кодируется как тензор — многомерный массив. Для стандартного RGB-изображения размера H×W это тензор формы:

[H, W, 3]

где:

  • H — высота в пикселях,
  • W — ширина в пикселях,
  • 3 — количество каналов (Red, Green, Blue).

Для пакетной обработки (batch processing) добавляется ещё одно измерение — размер батча B:

[B, H, W, 3]   (формат NHWC, принятый в TensorFlow)
или
[B, 3, H, W] (формат NCHW, принятый в PyTorch)

Это не просто соглашение — выбор формата влияет на производительность: графические ускорители (GPU, TPU) оптимизированы под конкретные layout’ы памяти. Например, NCHW позволяет более эффективно использовать векторные инструкции при свёртках.

Важно: каналы не обязаны быть RGB. В задачах дистанционного зондирования это могут быть спектральные каналы (NIR, SWIR), в медицине — срезы КТ, в многоспектральной съёмке — десятки каналов. Архитектура сети адаптируется под количество входных каналов, но принцип остаётся тем же.


16.2. Препроцессинг

Перед подачей в сеть изображение проходит серию преобразований. Это нормализация данных для стабильного и быстрого обучения.

16.2.1. Геометрическая нормализация
  • Изменение размера (resizing) — приведение всех изображений к фиксированному разрешению (например, 224×224 для ResNet). Метод интерполяции выбирается с учётом задачи:

    • билинейная — для естественных изображений,
    • ближайший сосед — для сегментационных масок (чтобы не создавать промежуточных классов),
    • адаптивное обрезание (center crop) — сохранение центральной части без искажений, если пропорции важны.
  • Выравнивание (alignment) — в задачах распознавания лиц или документов изображение приводится к эталонной ориентации по ключевым точкам (глаза, углы листа), чтобы уменьшить вариативность.

16.2.2. Цветовая и яркостная нормализация
  • Перевод в диапазон [0, 1] или [−1, +1] — деление на 255 (для 8-битных RGB) или линейное отображение. Это ускоряет сходимость, так как веса сети начинают обучаться на сопоставимых масштабах.

  • Центрирование и стандартизация — вычитание среднего и деление на стандартное отклонение, вычисленные на большом наборе данных (например, ImageNet):

    R_norm = (R − 0.485) / 0.229  
    G_norm = (G − 0.456) / 0.224
    B_norm = (B − 0.406) / 0.225

    Это компенсирует статистические смещения и делает вход «нейтральным» относительно распределения признаков.

  • Баланс белого и цветокоррекция — в промышленных системах (например, контроль качества) применяются калибровочные таблицы, чтобы исключить влияние освещения.

16.2.3. Удаление артефактов
  • Дебайзинг (denoising) — предварительное подавление шума (например, с помощью BM3D или простого медианного фильтра), если шум мешает признакам.
  • Дерингинг и деблокинг — устранение артефактов JPEG перед анализом текста или мелких структур.

Препроцессинг выполняется как на этапе подготовки данных (offline), так и «на лету» во время обучения (online), что является формой аугментации.


16.3. Аугментация данных

Аугментация — ключевой приём для борьбы с переобучением и повышения обобщающей способности. Она генерирует новые обучающие примеры из существующих с помощью инвариантных (не меняющих семантику) преобразований.

16.3.1. Геометрические трансформации
  • Поворот (rotation) — на небольшие углы (±15°), особенно для задач, инвариантных к ориентации (распознавание объектов).
  • Отражение (flip) — горизонтальное (часто допустимо), вертикальное (осторожно: цифры 6/9, текст).
  • Изменение масштаба (zoom in/out) — моделирование изменения дистанции до объекта.
  • Сдвиг (translation) — перемещение объекта в кадре.
  • Аффинные искажения (shear, perspective) — имитация наклона камеры.

Все эти операции реализуются как аффинные преобразования на уровне растра — с интерполяцией и обрезанием за границами.

16.3.2. Фотометрические трансформации
  • Изменение яркости, контраста, насыщенности — моделирование разных условий освещения.
  • Добавление шума (Gaussian, Poisson) — повышение робастности к реальным условиям съёмки.
  • Имитация размытия (motion blur, defocus blur) — для задач, где камера может двигаться.
16.3.3. Продвинутая аугментация
  • Cutout / Random Erasing — случайное «закрашивание» прямоугольных областей. Заставляет сеть не полагаться на локальные признаки.
  • Mixup — линейная интерполяция двух изображений и их меток:

    x_new = λ·x₁ + (1−λ)·x₂,
    y_new = λ·y₁ + (1−λ)·y₂.
    Сглаживает границы между классами в пространстве признаков.

  • Style transfer-аугментация — применение стилей из других доменов (например, рисунки → фото), чтобы улучшить перенос обучения.

Важно: аугментация должна быть семантически корректной. Например, для распознавания дорожных знаков недопустимо зеркальное отражение (знаки «поворот направо» и «налево» различны).


16.4. Свёрточные нейронные сети

Свёрточные слои (Convolutional Layers) — основной инструмент для работы с растрами. Они вводят две ключевые идеи:

  1. Локальность (local receptive field) — каждый нейрон анализирует только небольшую область входа (например, 3×3 пикселя), что отражает свойство визуального восприятия: локальные признаки важнее глобальных на ранних этапах.
  2. Параметрическая разделяемость (weight sharing) — одно и то же ядро (фильтр) применяется ко всем позициям изображения. Это резко сокращает количество параметров и обеспечивает трансляционную инвариантность: объект распознаётся независимо от положения в кадре.
16.4.1. Иерархия признаков

По мере прохождения через слои сеть строит иерархию представлений:

  • Ранние слои — реагируют на простые структуры: края, углы, пятна (аналогично V1-зоне зрительной коры).
  • Средние слои — комбинируют их в текстуры, повторяющиеся паттерны (кирпичная кладка, листва).
  • Поздние слои — формируют сложные семантические признаки: части объектов (глаз, колесо), а затем и целые объекты.

Это можно визуализировать через активационные карты (feature maps) — растровые изображения, где яркость показывает, насколько «возбуждён» фильтр в данной позиции.

16.4.2. Пулинг и понижение разрешения

Операции макс-пулинга (max pooling) и усредняющий пулинг уменьшают пространственное разрешение, сохраняя наиболее значимые признаки:

  • макс-пулинг (2×2, stride=2) — оставляет максимальное значение в каждом блоке, делая представление устойчивым к небольшим сдвигам,
  • свёртка с stride > 1 — альтернатива пулингу, обучаемая.

Результат — постепенное «сжатие» пространственной информации и «расширение» семантической.


16.5. Специфические архитектуры для растровых задач

16.5.1. Сегментация: U-Net и encoder-decoder

Задача пиксельной классификации (semantic segmentation) требует сохранения пространственного разрешения. Архитектура U-Net решает это через:

  • Encoder — стандартный CNN (например, ResNet), понижающий разрешение и извлекающий признаки,
  • Decoder — транспонированные свёртки («де-свёртки»), повышающие разрешение,
  • Skip-connections — прямые связи от encoder’а к decoder’у, передающие мелкие детали, потерянные при пулинге.

Выход — тензор [H, W, C], где C — количество классов, а каждая позиция содержит логиты для softmax.

16.5.2. Обнаружение объектов: R-CNN, YOLO, DETR

Здесь растр используется двумя способами:

  • Области интереса (RoI) — сеть или внешний алгоритм (Selective Search, RPN) выделяет прямоугольники, внутри которых запускается классификатор.
  • Прямое предсказание (YOLO, SSD) — разбивает изображение на сетку, в каждой ячейке предсказывает bounding box’ы и классы.
  • Трансформерные подходы (DETR) — обрабатывают растр как последовательность патчей (аналогично Vision Transformer), что позволяет моделировать глобальные зависимости.
16.5.3. Генеративные модели: GAN и диффузионные модели
  • GAN (Generative Adversarial Networks) — генератор принимает случайный вектор и выдаёт растр (например, 64×64×3), дискриминатор оценивает его реалистичность. Обучение — минимаксная игра.
  • Диффузионные модели — постепенно добавляют шум к изображению, затем учат сеть обращать этот процесс. Позволяют генерировать изображения высокого разрешения (1024×1024+) с деталями, недоступными GAN.

Обе модели работают непосредственно с растровым представлением, что делает их крайне чувствительными к артефактам и требует продуманного препроцессинга.


16.6. Представление данных: форматы хранения для обучения

При работе с большими наборами данных (ImageNet — 1,28 млн изображений, COCO — 330 тыс. + аннотации) эффективность ввода-вывода становится критичной.

16.6.1. Проблемы хранения по файлам
  • Миллионы мелких файлов → высокая нагрузка на файловую систему (inode exhaustion, seek latency),
  • Фрагментация,
  • Сложность параллельного чтения.
16.6.2. Агрегированные форматы
  • TFRecord (TensorFlow) — поток записей в формате Protocol Buffers. Каждая запись — сериализованное изображение + метаданные (метка, bbox, маска). Поддерживает сжатие (GZIP, ZLIB).
  • LMDB (Lightning Memory-Mapped Database) — key-value хранилище на основе memory-mapped файлов. Обеспечивает параллельное чтение, устойчиво к сбоям. Широко используется в Caffe, Detectron2.
  • WebDataset — хранение в архивах .tar, где каждый файл — запись в JSON/Image/набор бинарных данных. Оптимизировано для потоковой загрузки из облака.

Эти форматы позволяют:

  • читать данные последовательно (минимум seek’ов),
  • декодировать «на лету» в pipeline (например, с помощью tf.data или torch.utils.data),
  • легко масштабироваться на кластерах.

16.7. Ограничения растрового представления в глубоком обучении

Несмотря на успехи, растровая модель накладывает фундаментальные ограничения:

ПроблемаПроявлениеЧастичные решения
Зависимость от разрешенияСеть, обученная на 224×224, плохо работает на 4K без fine-tuningMulti-scale training, test-time augmentation, адаптивные пулы (AdaptiveAvgPool), Vision Transformer с динамическим патчингом
Потеря геометрической точностиПулинг и stride-свёртки снижают пространственную точностьAtrous (dilated) convolutions, Hourglass networks, координатные свёртки (CoordConv)
Неустойчивость к аффинным преобразованиямПоворот на 90° может «сломать» предсказаниеSTN (Spatial Transformer Networks), Capsule Networks, data augmentation
Смещение домена (domain shift)Сеть, обученная на фото, плохо работает на схемах/чертежахDomain adaptation, style transfer, синтетические данные (GAN-генерация)
Требовательность к даннымТысячи/миллионы размеченных изображений для обученияSelf-supervised learning (MoCo, DINO), few-shot learning, transfer learning

17. Производительность и оптимизация растровой графики

Эффективная работа с растрами требует координации усилий на нескольких уровнях:

  • Физическом (память, кэш, диск),
  • Алгоритмическом (сложность операций),
  • Архитектурном (CPU/GPU/NPU, конвейеризация),
  • Системном (форматы, потоковая обработка, распределение).

Ниже рассматриваются ключевые аспекты, объединённые общей целью: минимизировать задержку и потребление ресурсов при сохранении качества.


17.1. Модель памяти и доступ к данным

Растровые изображения — объёмные массивы. Даже небольшое 4K-изображение (3840 × 2160 × 4 байта = RGBA) занимает ≈ 33 МБ в несжатом виде. При обработке нескольких изображений или многослойных данных (например, в редакторе) требования к памяти быстро достигают гигабайтов.

17.1.1. Проблема locality (локальности обращений)

Современные процессоры работают на порядки быстрее, чем память. Чтобы компенсировать это, используются иерархические кэши (L1, L2, L3). Эффективность кэширования определяется пространственной и временной локальностью:

  • Пространственная локальность — если прочитан пиксель (x, y), вероятно, скоро понадобятся (x+1, y), (x, y+1).
  • Временная локальность — если пиксель использован, он может понадобиться снова (например, при многократном проходе фильтра).

Проблема: хранение растра по строкам (row-major) хорошо для горизонтальных операций (например, фильтрация по X), но плохо для вертикальных (столбцы физически удалены в памяти). Решения:

  • Tiled layout (блочное хранение) — растр разбивается на небольшие квадраты (например, 64×64), каждый хранится как единый блок. Это улучшает locality для 2D-операций (свёртки, морфология). Используется в GPU-текстурах, COG, OpenEXR.
  • Z-order (Morton order) — рекурсивная Z-образная развёртка, обеспечивающая хорошую locality в обоих измерениях. Применяется в некоторых ГИС-системах и базах данных (например, для пространственных индексов).
17.1.2. Zero-copy pipelines

Каждое копирование данных между буферами (CPU → GPU, пользовательское пространство → ядро) — дорогостоящая операция. Поэтому современные API стремятся к zero-copy:

  • DMA (Direct Memory Access) — устройство (GPU, сетевая карта) читает данные напрямую из RAM без участия CPU.
  • Shared memory — CPU и GPU работают с одним физическим буфером (через VK_KHR_external_memory, cudaHostRegister).
  • Memory mapping (mmap) — файл отображается в адресное пространство процесса; чтение данных = доступ по указателю, без явного read(). Широко используется в libvips, GDAL, медиаплеерах.

Пример: при декодировании JPEG в браузере Chrome изображение декодируется напрямую в видеопамять GPU через zero-copy pipeline — без промежуточного буфера в RAM.


17.2. Конвейеризация и параллелизм

Растровые операции часто ** embarrassingly parallel **— каждый пиксель (или блок) может обрабатываться независимо. Это позволяет эффективно использовать:

17.2.1. SIMD (Single Instruction, Multiple Data)

Современные CPU поддерживают векторные инструкции (AVX-512, NEON), позволяющие обрабатывать 4–16 пикселей за такт. Например, усредняющий фильтр 3×3 может быть реализован как:

  1. Загрузка трёх строк в векторные регистры,
  2. Горизонтальное суммирование с весами,
  3. Вертикальное суммирование,
  4. Запись результата.

Библиотеки вроде Intel IPP, OpenCV (с включённым WITH_IPP/WITH_TBB) автоматически используют SIMD.

17.2.2. Многопоточность (multi-threading)
  • Разделение по строкам/блокам — каждый поток обрабатывает свою полосу изображения. Важно минимизировать синхронизацию (например, не писать в общий гистограммный массив без атомарных операций).
  • Task-based parallelism — фреймворки вроде TBB (Intel Threading Building Blocks) или Rayon (Rust) динамически распределяют задачи, адаптируясь к нагрузке.
17.2.3. GPU-ускорение

GPU — массив из тысяч простых ядер, идеально подходящих для растровых вычислений.

  • CUDA / HIP / OpenCL — низкоуровневые API для написания ядер (kernel’ов), выполняемых на GPU.
  • Vulkan / DirectX 12 — графические API, позволяющие использовать compute shaders для рендеринга и для GPGPU-задач (например, фильтрация, FFT).
  • WebGPU — стандарт для веба, заменяющий WebGL Compute. Позволяет запускать compute shaders в браузере с низкой задержкой.

Пример: медианный фильтр 5×5 на CPU (однопоточно) для 4K-изображения — ~800 мс; на GPU (CUDA) — < 5 мс.

17.2.4. NPU и специализированные ускорители
  • NPU (Neural Processing Unit) — в SoC (Apple Neural Engine, Huawei Da Vinci, Qualcomm Hexagon) оптимизированы под матричные операции (свёртки, трансформеры).
  • TPU (Tensor Processing Unit) — Google, для обучения и инференса моделей.
  • FPGA — программируемая логика, позволяет реализовать конвейер «под задачу» (например, реалтайм-обработка с датчиков в промышленности).

Эти устройства требуют данных в специфических layout’ах (например, NCHW для NPU), что стимулирует развитие zero-copy конверсий.


17.3. Потоковая обработка (streaming) и ленивая загрузка

Полная загрузка изображения в память часто избыточна. Достаточно обработать только видимую или требуемую часть.

17.3.1. Tiled processing

Идея: разбить растр на плитки, обрабатывать их по мере необходимости.

  • В редакторах (Photoshop, GIMP) — при масштабировании или прокрутке загружаются только видимые тайлы.
  • В ГИС — COG, WMTS работают по принципу «запросил — получил тайл».
  • В медиа — видеокодеки (H.264/HEVC) используют macroblocks (16×16), что позволяет декодировать отдельные регионы.
17.3.2. Lazy evaluation

Библиотеки вроде libvips и rasterio строят вычислительные графы, откладывая выполнение до момента, когда результат действительно нужен (например, запись в файл или отображение).

Пример на libvips (Python):

image = pyvips.Image.new_from_file("huge.tif")
cropped = image.crop(1000, 1000, 500, 500)
resized = cropped.resize(0.5)
sharpened = resized.conv(VIPS_KERNEL_SHARP)
sharpened.write_to_file("output.jpg")

Здесь операции crop, resize, conv не выполняются сразу — строится pipeline. Только при write_to_file запускается обработка только нужного региона с минимальным промежуточным буфером.

Преимущества:

  • Потребление памяти зависит от размера выхода,
  • Автоматическая оптимизация (например, объединение resize и crop в один шаг),
  • Возможность распараллеливания на уровне плиток.
17.3.3. Progressive decoding

Форматы вроде JPEG 2000, AVIF, WebP поддерживают постепенную загрузку:

  • Сначала декодируется низкое разрешение (для предпросмотра),
  • Затем — дополнительные слои для повышения качества.

В вебе это реализуется через:

  • <img loading="lazy">,
  • Intersection Observer API — загрузка изображений только при попадании в viewport,
  • srcset + sizes — выбор оптимального разрешения под устройство.

17.4. Сжатие и кодирование в реальном времени

Выбор формата — компромисс между скоростью кодирования/декодирования, размером и качеством.

ФорматСкорость кодированияСкорость декодированияСтепень сжатияПрименение
PNGМедленноБыстроСредняя (lossless)Скриншоты, иконки
JPEGБыстроОчень быстроВысокая (lossy)Фото, веб
WebPУмеренноБыстроВыше JPEGВеб, мобильные приложения
AVIFМедленноУмеренноНаивысшая (lossy/lossless)HDR, архивы, будущее веба
FLIF/JPEG XLМедленноБыстроОчень высокая (lossless)Профессиональное хранение

Для реалтайма (видеоконференции, стриминг) критична скорость декодирования и задержка:

  • H.264/AVC — баланс скорости и сжатия, аппаратная поддержка везде,
  • H.265/HEVC — +50% сжатия, но лицензирование и высокая нагрузка на CPU,
  • AV1 — открытый, эффективный, но требует мощного декодера (GPU/NPU),
  • VP9 — компромисс между AV1 и H.264, поддержка в YouTube, Chrome.

Важно: современные кодеки используют пространственно-временное предсказание, адаптивные блоки, фильтры deblocking, что делает их эффективнее простых растровых схем (типа RLE или LZW).


17.5. Тестирование и профилирование

Оптимизация без измерений — слепая. Ключевые метрики:

  • **Throughput **(пропускная способность) — изображений/сек или пикселей/сек,
  • **Latency **(задержка) — время от входа до выхода (критично для AR, роботов),
  • Memory footprint — пиковый и средний объём RAM/VRAM,
  • Energy consumption — особенно для мобильных и embedded-устройств.

Инструменты:

  • **perf **(Linux) — анализ кэш-промахов, branch misprediction,
  • **VTune **(Intel) / **Nsight **(NVIDIA) — профилирование CPU/GPU,
  • RenderDoc — захват и анализ графических команд,
  • py-spy / tracy — профилирование Python/C++ без реинструментации.

Пример: если 70% времени уходит на memcpy между CPU и GPU — оптимизация SIMD бесполезна; нужен zero-copy.