Лабораторная работа 4 · компьютерное зрение

Цветокоррекция по шагам

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

9.88 → 6.04средний ΔE76 по 24 полям, до → после коррекции
12.58 → 6.53то же на 6 проверочных полях, которые не участвовали в расчёте
9 чиселвся коррекция — матрица 3×3
≈2694 Kтёплая светодиодная лампа, 58 лк
ФотоJPEG, Display P3
→
Линеаризацияснять гамму
→
Поиск мишенисвой алгоритм
→
24 цветакамера и эталон
→
МНК по 18 полямP = Y·X⁺
→
c′ = P·cкаждый пиксель
→
Оценка ΔE766 проверочных полей
Спектры (CSV)лампа, объект
→
XYZΣ S·R·x̄ȳz̄
→
Labчто видит человек
→
Сравнениес фото до и после

Проект в шести предложениях

  1. Сфотографировали сцену вместе с ColorChecker — мишенью из 24 цветов, точные значения которых известны.
  2. Программа сама нашла мишень на фото и измерила, какими камера записала эти 24 цвета.
  3. По 18 полям методом наименьших квадратов нашли 9 чисел — матрицу 3×3, которая лучше всего переводит «цвета камеры» в «правильные».
  4. Умножили каждый пиксель фото на эту матрицу и получили исправленное фото.
  5. Проверили на 6 полях, не участвовавших в расчёте: средняя ошибка ΔE76 упала с 12.6 до 6.5.
  6. По спектрам лампы и оранжевого объекта рассчитали, какой цвет видит человек, и сравнили его с фото до и после коррекции.
Часть 1

Теория без страха

Шесть идей, без которых проект не объяснить. Каждая — на твоих данных.

Идея 1

Цвет — это три числа

Каждый пиксель хранит три числа: сколько в нём красного (R), зелёного (G) и синего (B). В JPEG это целые от 0 до 255. Для расчётов их делят на 255 и получают дроби от 0 до 1.

Тройку чисел в математике называют вектором и записывают столбиком: c = (R, G, B). Удобная картинка — точка в кубе: по одной оси R, по другой G, по третьей B. Чёрный — угол (0, 0, 0), белый — противоположный угол (1, 1, 1), серые лежат на диагонали между ними, где R = G = B.

Поэтому «исправить цвет» значит превратить одну тройку чисел в другую. Вопрос только в том, каким правилом.

стендКак камера записала поле ColorChecker и каким оно должно быть
Идея 2

Числа в JPEG — не количество света

Глаз хорошо различает оттенки в тенях и хуже — в светах. Чтобы не тратить 256 уровней впустую, JPEG хранит числа после гамма-кривой: тёмным тонам отдано больше уровней. Поэтому число 128 из 255 — это не половина света, а примерно 22 %.

Матрица складывает и умножает цвета. Это правильно только для чисел, пропорциональных количеству света: свет от двух ламп складывается, в тени света во столько-то раз меньше. Поэтому первым делом числа JPEG линеаризуют, то есть снимают гамму:

v = число / 255
если v ≤ 0.04045:  lin = v / 12.92
иначе:  lin = ((v + 0.055) / 1.055)2.4

После коррекции делают обратное: enc = 1.055 · lin1/2.4 − 0.055, затем ×255.

стендДвигай ползунок: сколько света на самом деле означает число из JPEG

Пример из твоего снимка: пиксель оранжевого поля №7 записан как (210, 139, 31). После линеаризации это (0.6445, 0.2582, 0.0137): красного 64 % от максимума, а синего всего 1.4 %.

реальная кривая sRGBесли бы гаммы не было
Display P3. Камера сохранила фото не в обычном sRGB, а в пространстве Display P3: у него «шире» основные цвета, поэтому насыщенные цвета записываются точнее. Гамма-кривая у P3 такая же, как у sRGB, поэтому линеаризуем той же формулой. Отличие учитывается позже, при переводе в XYZ: там берётся матрица P3.
Идея 3

Матрица — это три рецепта смешивания

Матрица 3×3 — таблица из 9 чисел. Удобно думать о ней как о трёх рецептах: каждая строка говорит, как приготовить один новый канал из трёх старых.

R′ = p₁₁·R + p₁₂·G + p₁₃·B
G′ = p₂₁·R + p₂₂·G + p₂₃·B
B′ = p₃₁·R + p₃₂·G + p₃₃·B

Это и есть умножение матрицы на вектор, коротко c′ = P · c. Правило одно: строку матрицы поэлементно умножаем на столбец вектора и складываем три произведения. Три строки дают три новых числа.

Разминка на простых числах, c = (0.5, 0.2, 0.1)

1. Единичная матрица
100010001
·
0.50.20.1
=
0.50.20.1

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

2. Диагональная матрица
1.200010000.8
·
0.50.20.1
=
0.60.20.08

Каждый канал умножен на своё число: R×1.2, B×0.8. Каналы не смешиваются. Это и есть «вектор 3×1 множителей», он же баланс белого.

3. Смешивающая матрица
1.2−0.200100.100.9
·
0.50.20.1
=
0.560.20.14

R′ = 1.2·0.5 − 0.2·0.2 + 0·0.1 = 0.56. B′ = 0.1·0.5 + 0·0.2 + 0.9·0.1 = 0.14. Новый синий зависит и от старого красного. Такое умеет только полная матрица.

стендНаша матрица P на реальном поле: выбери поле и смотри умножение по строкам
Идея 4 · главный вопрос

Почему 3×3, а не 3×1

Идея «вектора 3×1, который показывает, насколько каждый цвет отличается от образца», понимается двумя способами. Разберём оба.

Вариант А: своя разница для каждого поля

Разницу для каждого из 24 полей мы и так считаем — это ΔE (идея 6). Но это диагностика: она говорит, насколько ошибся цвет, и ничего не говорит о цветах, которых нет на мишени. На фото 16 миллионов пикселей, и почти ни один не совпадает ни с одним из 24 полей. Оранжевый барабан — не поле №7. Какую из 24 разниц к нему прибавлять? Нужно одно правило для любого цвета, а мишень служит только для того, чтобы это правило подобрать.

Вариант Б: один вектор на все цвета

Его можно либо прибавлять ко всем пикселям (c + d), либо умножать каждый канал на своё число (g₁·R, g₂·G, g₃·B; это диагональная матрица из разминки №2). Ниже все варианты посчитаны на твоих 18 полях тем же методом наименьших квадратов, а проверены на всех 24 и на 6 проверочных.

расчётСредний ΔE76 для разных правил коррекции (меньше — лучше)
все 24 поля6 проверочных полей

Здесь ΔE посчитан по средним цветам полей без обрезки значений. Поэтому у матрицы 5.85, а в ноутбуке 6.04: там ΔE мерится по готовому фото, где значения обрезаны до [0, 1].

Почему прибавка ломается: чёрное поле №24
камера   (0.0176, 0.0168, 0.0152)
+ d      (−0.0083, −0.0188, −0.0132)
= (0.0093, −0.0020, 0.0020)
эталон   (0.0314, 0.0315, 0.0323)

Зелёный стал отрицательным — такого света не бывает. ΔE чёрного выросла с 7.2 до 20.7. Причина физическая: в тени света меньше во сколько-то раз, а не на сколько-то единиц. Правильная коррекция должна умножать, а не прибавлять.

Почему множителей мало: оранжевое поле №7
камера     (0.6445, 0.2582, 0.0137)
× g        (1.0111, 0.9647, 0.9252)
= (0.6517, 0.2491, 0.0127)
эталон     (0.7460, 0.2020, 0.0299)

Камера сделала оранжевый слишком «жёлтым»: синего почти нет. Множитель синего 0.925 синий только уменьшает. Добавить синего пропорционально красному умеет лишь матрица 3×3, за счёт элемента p₃₁ = +0.0782:

B′ = 0.0782·0.6445 − 0.0271·0.2582 + 0.8823·0.0137 = 0.0555

Синий вырос, даже с перелётом, но ΔE поля упала с 24.9 до 9.1.

Почему каналам нужно смешиваться

Цветные фильтры на пикселях сенсора пропускают не строго «свой» цвет: «красный» пиксель немного реагирует на зелёный свет, «зелёный» — на красный и синий. Даже чувствительности глаза сильно перекрываются; ниже стандартные кривые CIE, они пригодятся в спектральной части. У камеры свои кривые, перекрытые иначе, чем у глаза. Чтобы «распутать» каналы, новый красный должен, например, вычесть немного зелёного. Это делают элементы матрицы вне диагонали, а у вектора 3×1 их нет.

данные CIEЧувствительности стандартного наблюдателя CIE 1931 (2°) — каналы перекрываются
x̄ (условно «красный»)ȳ («зелёный», он же яркость)z̄ («синий»)

Почему именно 3×3, а не больше

3 входных канала × 3 выходных = 9 коэффициентов. Это самое общее линейное правило для цвета, а 3×1 — его частный случай с нулями вне диагонали, поэтому 3×3 по определению не хуже. Линейность важна: если объект в тени получает вдвое меньше света, то P·(0.5·c) = 0.5·(P·c), и одна матрица правильно работает для любой освещённости.

Физика: сигнал сенсора — это сумма «свет × чувствительность» по всем длинам волн, то есть линейная операция. Если бы кривые камеры были смесью кривых глаза (это называют условием Лютера — Айвса), матрица 3×3 переводила бы цвета камеры в цвета глаза точно. На практике это выполняется приблизительно, поэтому ошибка не ноль. Бывают модели сложнее, например полиномиальные 3×10, но ТЗ требует 3×3, а 9 чисел надёжно находятся по 18 полям.

Идея 5

Как найти 9 чисел: метод наименьших квадратов

Для каждого из 18 обучающих полей известно, что записала камера, и каким цвет должен быть. Ищем матрицу P, для которой P·c как можно ближе к эталону сразу для всех 18 полей. Попасть точно нельзя: неизвестных 9, а условий 18 × 3 = 54. Значит, нужен компромисс. Метод наименьших квадратов выбирает его так, чтобы сумма квадратов всех ошибок была минимальной. Квадрат нужен, чтобы ошибки «+0.1» и «−0.1» не гасили друг друга, а большие промахи штрафовались сильнее.

Шаг 1. Сначала на одном числе

Пусть нужен только один множитель для красного: R_эталон ≈ p · R_камеры. Каждая точка ниже — одно из 18 полей: по горизонтали красный в камере, по вертикали красный в эталоне. Прямая — правило y = p·x, вертикальные отрезки — ошибки. Двигай p и следи за суммой квадратов.

стендПодбери множитель p вручную, потом нажми «Найти минимум»

Кривая — сумма квадратов ошибок для каждого p. У неё одна точка минимума, и её можно найти формулой, без перебора:

Шаг 2. Три входа: одна строка матрицы

Теперь новый красный строим из всех трёх каналов камеры: R′ = p₁₁·R + p₁₂·G + p₁₃·B. Это та же задача, только подбираем три числа сразу. В таблице видно, что даёт найденная строка (1.2240, −0.2461, −0.0518) на каждом из 18 полей, и сравнение с «ничего не менять» (1, 0, 0).

данныеСтрока R′ матрицы на 18 обучающих полях

Шаг 3. Все 9 чисел сразу: матричная формула

Сложим данные в две таблицы. X — цвета камеры, 3 строки (R, G, B) × 18 столбцов (поля). Y — эталон, тоже 3 × 18. Хотим P·X ≈ Y.

Если бы X была квадратной, можно было бы «поделить»: P = Y·X⁻¹. Но X — 3×18, обычной обратной у неё нет. Поэтому обе части умножают справа на Xᵀ (транспонированная X: строки и столбцы поменяли местами, получилось 18×3):

P · X · Xᵀ = Y · Xᵀ    ← теперь X·Xᵀ квадратная (3×3), её можно обратить
P = Y · Xᵀ · (X · Xᵀ)−1 = Y · X⁺

Выражение X⁺ = Xᵀ·(X·Xᵀ)⁻¹ называют псевдообратной матрицей Мура — Пенроуза. Это обобщение обратной матрицы на неквадратный случай. Именно такое P даёт минимум суммы квадратов ошибок: это то же условие «производная равна нулю», что и в шаге 1.

Сравни с шагом 1: там p = Σxy / Σx². Здесь X·Xᵀ играет роль Σx², Y·Xᵀ — роль Σxy, а деление заменено умножением на обратную матрицу.

Обратная матрица: для чисел «поделить на a» значит «умножить на 1/a», потому что a·(1/a) = 1. Для матриц роль единицы играет единичная матрица I из разминки, а обратная A⁻¹ — это такая матрица, что A·A⁻¹ = I.

расчётЧто внутри формулы, на твоих числах
Идея 6

Lab и ΔE76: как измерить «насколько отличается»

В RGB одинаковая разница чисел видна по-разному: в тенях сильнее, в светах слабее. Поэтому для оценки цвета переходят в пространство CIELAB:

  • L* — светлота: 0 чёрный, 100 белый;
  • a* — ось «зелёный (−) ↔ красный (+)»;
  • b* — ось «синий (−) ↔ жёлтый (+)».

Lab построено так, что расстояние между точками примерно равно заметности разницы для глаза. ΔE76 — обычное расстояние по теореме Пифагора в трёх измерениях:

ΔE76 = √( (L₁ − L₂)² + (a₁ − a₂)² + (b₁ − b₂)² )

Как читать ΔE (распространённая шкала, Mokrzycki и Tatol, 2011):

0–1разницы не видно
1–2заметит только опытный глаз
2–3.5заметно любому при сравнении
3.5–5явная разница
> 5воспринимаются как разные цвета

Почему везде D50. Эталон ColorChecker задан для стандартного дневного света D50 (около 5000 K), а sRGB и P3 рассчитаны на белый D65 (около 6500 K). Чтобы сравнивать честно, цвета переносят к белому D50 хроматической адаптацией Брэдфорда. Это тоже матрица 3×3, которая имитирует, как глаз подстраивается под цвет освещения: белый лист кажется белым и при лампе, и днём.

расчётПоле №7 «Orange» после коррекции: от RGB до ΔE, все промежуточные числа
Часть 2

Ход работы на твоих данных

Те же идеи, собранные в программу: что делает каждый блок ноутбука и какие числа получаются.

Шаг 1

Исходные данные

Снимок (из EXIF)
Дата и время03.10.2026 15:27:04
Камераvivo V27e
Диафрагма, выдержка, ISOf/1.79, 1/50 с, 555
Фокусное4.84 мм (≈25 мм экв.)
Баланс белогоавтоматический
Размер3456 × 4608
Цветовой профильDisplay P3
Файлы и откуда они
  • Фото — сцена и ColorChecker Passport; используем левую страницу, Classic 24.
  • Эталон — 24 значения L*a*b* (D50) от X-Rite, рецептура после ноября 2014 г.
  • light.csv — спектр лампы: 36 чисел от 380 до 730 нм через 10 нм, в мВт/(м²·нм).
  • objects.csv — спектральное отражение 3 объектов в %. Наш оранжевый — строка 2.

Первые 6 колонок CSV прибор посчитал сам: X, Y, Z, L*, a*, b* при D50. Мы пересчитали XYZ лампы из спектра и получили 64.92 / 57.85 / 18.58 против 64.93 / 57.85 / 18.60 у прибора. Значит, формулы и таблицы верные.

Шаг 2

Поиск ColorChecker собственным алгоритмом

Детектор работает на уменьшенной копии фото, 1200 px по длинной стороне, и проходит 9 шагов из ТЗ:

  1. Серое и [0, 1]. Цвет для поиска формы не нужен, хватает яркости.
  2. Шумоподавление. Билатеральный фильтр сглаживает шум, но не размывает границы полей, потому что усредняет только похожие по яркости соседние пиксели.
  3. Адаптивный порог. Пиксель становится белым, если он светлее среднего по своей окрестности (окно ~50 px). Один общий порог на весь кадр не сработал бы: освещение неравномерное. Поля светлее чёрной рамки мишени, поэтому выделяются.
  4. Эрозия + дилатация. Сначала «съедаем» края белых пятен на 1 пиксель, потом наращиваем обратно. Мелкие точки шума исчезают, крупные пятна остаются.
  5. Контуры. Обводим каждое белое пятно: 984 контура.
  6. Фильтр. Оставляем пятна нужной площади, почти квадратные (стороны отличаются меньше чем в 1.35 раза) и плотно заполняющие описанный прямоугольник (больше 85 %). Круг заполняет описанный квадрат на 78.5 %, поэтому шипы LEGO и отверстия отсекаются. Осталось 41 кандидат.
  7. Кластеры. Каждый квадрат увеличиваем в 1.5 раза: соседние поля одной мишени слипаются в одно пятно. Получилось 2 кластера: левая и правая страницы Passport.
  8. Проверка решётки. Поля должны быть одного размера и лежать в узлах решётки 4×6. Правая страница (22 образца разного размера) отклонена. Левая: 19 полей точно в узлах.
  9. Гомография. Это формула, которая переводит «номер ячейки» (столбец, строка) в координаты пикселя с учётом наклона и перспективы. Находим её по 19 найденным полям (свой код, метод DLT) и вычисляем, где лежат 5 ненайденных: тёмные поля почти сливаются с чёрной рамкой. Ошибка подгонки — 0.8 % шага решётки.

Ориентация. Мишень на фото повёрнута на 90°. Программа перебирает 8 вариантов нумерации (4 поворота × зеркало) и для каждого считает, насколько хорошо цвета подходят под эталон. Верный вариант даёт невязку 0.314, следующий 2.084, ошибиться невозможно.

Цвет поля — медиана примерно 4500 пикселей в центральном квадрате (около половины поля). Края, тень от рамки и метки «+» в выборку не попадают. Медиана, а не среднее: случайные выбросы (шум, пылинка) на медиану почти не влияют.

Шаги детектора: серое изображение, адаптивный порог, морфология, контуры, кандидаты, кластеры
Шаги детектора на твоём снимке. Внизу справа зелёным выделен принятый кластер, синим — отклонённая правая страница.
Найденные поля ColorChecker с номерами
Номера полей по эталону и зоны усреднения. Мишень повёрнута: белое поле №19 — слева вверху.
Шаг 3

24 цвета: таблица целиком

Это все данные, на которых строится матрица. Голубым выделены 6 проверочных полей. «Камера, 8 бит» — числа, как они лежат в JPEG (в P3). «Камера, линейные» — после снятия гаммы, это и есть столбцы матрицы X. «Эталон» — линейный sRGB, это столбцы Y.

Что видно по таблице: серые поля в камере чуть «красные» (R > G > B), у оранжевых и жёлтых синий канал занижен, тёмные поля темнее эталона. У Cyan эталонный R отрицательный: этот цвет чуть выходит за охват sRGB.

расчётКак получен эталон в RGB: поле №7, из L*a*b* в линейный sRGB
Шаг 4

Найденная матрица и что значит каждое число

  • p₁₁ = 1.224: красный усиливается на 22 %.
  • p₁₂ = −0.246: из красного вычитается четверть зелёного. Это «распутывание» каналов: красные становятся чище и насыщеннее.
  • p₂₂ = 1.090, p₃₃ = 0.882: зелёный чуть усиливается, синий ослабляется на 12 %.
  • p₃₁ = +0.078: в синий добавляется немного красного, и пересыщенные камерой оранжевые и жёлтые становятся менее «жёлтыми».
  • Суммы строк 0.926 / 0.947 / 0.933 почти равны. Для серого (R = G = B) каждый новый канал равен «сумма строки × серый», поэтому серый остаётся серым и темнеет примерно на 6 %.
Шаг 5

Применение к фото: путь одного пикселя

стендВыбери поле: весь путь его цвета через программу

Для всего фото делается то же самое, только сразу для 15 925 248 пикселей (3456 × 4608). Изображение раскладывается в таблицу «15 925 248 строк × 3 столбца» и умножается на Pᵀ одной операцией numpy: img_lin.reshape(-1, 3) @ CCM.T. Транспонирование нужно потому, что здесь пиксели записаны строками, а не столбцами.

У 3.08 % пикселей после умножения получилось число меньше 0 или больше 1. В основном это насыщенные голубые, синие и зелёные объекты (R′ < 0 у 2.61 % пикселей): камера записала их в широком P3, а в sRGB они не помещаются. Такие значения обрезаются до [0, 1].

Снимок до и после цветокоррекции
Слева исходник, справа после матрицы. Тёплый оттенок лампы ушёл: белый поднос и серые поля стали нейтральными.
Карта пикселей вне охвата sRGB
Пиксели, вышедшие за [0, 1] после матрицы.
Шаг 6

Оценка результата

ΔE76 по группам полей (из ноутбука)

На проверочных полях ошибка почти такая же, как на обучающих (6.53 против 5.88). Значит, матрица не просто запомнила 18 полей, а работает и на цветах, которых не видела.

Поля ColorChecker: эталон, до и после
Каждое поле: эталон | до | после, внизу ΔE до → после.
Смещение цветов на плоскости a*b*
Плоскость a*b*: кружок — эталон, стрелка указывает на цвет на снимке. После коррекции стрелки короче.
Оттенок серых полей (19–24)

У идеально серого a* = b* = 0. Насыщенность C* = √(a*² + b*²) показывает силу паразитного оттенка.

песочницаПопробуй свою матрицу: меняй числа и смотри, как меняются цвета и ошибка

Числа камеры (линейные P3) умножаются на эту матрицу, результат считается линейным sRGB. Попробуй поставить p₁₂ = 0 в нашей матрице и посмотри, что станет с красными.

В каждой плитке слева эталон, справа результат твоей матрицы. ΔE считается по средним цветам полей без обрезки.

Шаг 7

Спектральная часть: какой цвет видит человек

Это независимая от мишени проверка. Спектрофотометр измерил две вещи: S(λ) — сколько света лампа даёт на каждой длине волны, и R(λ) — какую долю этого света оранжевый объект отражает. Свет, пришедший от объекта в глаз, равен S(λ)·R(λ). Глаз оценивает его тремя чувствительностями x̄, ȳ, z̄ из идеи 4:

X = k · Σ S(λ)·R(λ)·x̄(λ)·Δλ
Y = k · Σ S(λ)·R(λ)·ȳ(λ)·Δλ
Z = k · Σ S(λ)·R(λ)·z̄(λ)·Δλ,    k = 100 / Σ S(λ)·ȳ(λ)·Δλ,  Δλ = 10 нм

Сумма по λ — это площадь под кривой произведения. Множитель k нормирует результат так, чтобы идеально белый лист (R = 1) имел Y = 100. Наведи курсор или нажми на график: снизу будут все числа на выбранной длине волны.

Все 36 длин волн и суммы
расчётОт сумм к L*a*b*
Оранжевый объект: расчёт по спектрам, снимок до и после коррекции
Участок крышки барабана и четыре варианта его цвета с ΔE76 к расчёту по спектрам.
Сравнение
Почему после коррекции объект дальше от расчёта (13.0 → 22.0). Матрица подгоняет цвета под эталон ColorChecker при D50, то есть убирает лампу и показывает сцену «как днём». А расчёт по спектрам — это цвет под тёплой лампой (~2700 K, провал в спектре у 480 нм, мало излучения дальше 650 нм). При таком свете оранжевый выглядит светлее и желтее, чем днём: между цветом под лампой и под D50 ΔE = 11.8. Если сравнивать с цветом под D50, коррекция помогла: 16.0 → 11.5. Оставшиеся 11.5: тон после коррекции на 7° краснее (матрица, точная для красок мишени, ошибается на пластике с другим спектром — это метамеризм), насыщенность ниже, а светлота на 5 единиц ниже, потому что крышка барабана освещена иначе, чем мишень.
Шаг 8

Ответы на вопросы ТЗ

Получилось ли качественное изображение?

Частично. Баланс стал нейтральным, пересыщенные жёлтые и оранжевые приближены к эталону, ΔE 9.9 → 6.0. Но ΔE ≈ 6 — всё ещё заметная разница. Насыщенные оранжевые и красные уходят в коралловый и малиновый. Главная причина — нелинейная обработка JPEG в смартфоне, которую матрица 3×3 не исправляет.

Имеют ли оттенок серые?

До коррекции слабый тёплый: a* до +1.7, b* до +3.9. После коррекции розоватость ушла (a* от −0.6 до +1.0), осталась лёгкая желтизна в тёмных серых: b* на 2–3 больше эталона, C* 1.6–3.9, около порога заметности. Тёмные серые ещё и темнее эталона (ΔL* до −7.4) — это тоновая кривая камеры.

Есть ли цветные артефакты?

Ореолов, полос и цветного шума нет: матрица близка к диагональной, внедиагональные элементы по модулю ≤ 0.25, поэтому шум почти не усиливается. Но 3.1 % пикселей вышли за охват sRGB и обрезаны (было 0.7 %), в основном насыщенные голубые, синие и зелёные. Там теряются насыщенность и тонкие переходы.

Насколько близок цвет на фото и расчётный по спектрам?

До коррекции ΔE = 13.0, после — 22.0 к цвету «под лампой». К цвету под D50 — 16.0 → 11.5. Коррекция переводит сцену к дневному свету, поэтому от «комнатного» цвета удаляется (подробно в шаге 7).

Часть 3

Вопросы на защите

Нажми на вопрос, чтобы открыть ответ. Сначала попробуй ответить сам.

Словарь терминов

Все числа на странице взяты из ноутбука lab4_color_correction.ipynb (снимок от 03.10.2026).