Разъяснение о том, как работают преобразования ColorMatrix
Я работаю над приложением для обработки изображений (для развлечения) и изо всех сил пытаюсь полностью понять, как работают преобразования ColorMatrix. Я получаю основы линейных / аффинных преобразований и прекрасно справляюсь с репликацией примеров в Интернете, но я хотел бы полностью понять, почему что-то работает, а не просто быть удовлетворенным, что оно работает.
Например, для простого преобразования изображения с целью получения его негатива (каждый цвет преобразуется в соответствующий комплимент) используется следующая матрица:
[-1, 0, 0, 0, 0]
[0, -1, 0, 0, 0]
[0, 0, -1, 0, 0]
[0, 0, 0, 1, 0]
[1, 1, 1, 0, 1]
Я понимаю, что -1 - это косинус 180 градусов, то есть вращение, необходимое для "переворачивания" цвета на его дополняющее, но я не понимаю, как вектор цвета можно умножить на приведенную выше матрицу и получить правильный дополнительный вектор.
Например, если пиксель имеет цветовой вектор [247, 255, 0, 255, 1] (с использованием пространства RGBAW), выполнение умножения на вышеуказанную матрицу приводит к [-247, -255, 0, 255, 1], но это не правильно, так как реальный дополнительный цвет вышеупомянутого - [8, 0, 255, 255, 1].
Мне здесь не хватает чего-то очевидного, и я с радостью признаю, что не совсем уверен в том, что делаю:) Представляем ли преобразованный цветовой вектор в какой-то другой системе координат? (например, не 0-255)
Если бы кто-нибудь мог помочь предоставить "недостающее звено" моего понимания, я был бы очень благодарен.
редактировать
Я только что обнаружил, что следующая матрица также работает и фактически математически интуитивна (она производит правильный вектор).
-1 0 0 0 0
0 -1 0 0 0
0 0 -1 0 0
1 1 1 1 0
0 0 0 0 1
Итак, мой новый вопрос: почему обе эти матрицы работают? Последнее дает мне более удовлетворительное решение, так как я могу понять, почему оно работает с алгебраической точки зрения. Четыре ряда используются для масштабирования? И если да, то почему масштабирование добавляет 255? Откуда он получает это значение?
Извините, если это действительно глупые вопросы, я пытаюсь разобраться с этим.
1 ответ
Вы правы, что нижняя строка предназначена для перевода. В своем комментарии Ганс говорит, что здесь задействован масштабный коэффициент 255, что, вероятно, и смущает вас. Один из способов взглянуть на это состоит в том, что все значения ARGB сначала делятся на 255, затем применяется умножение матриц, а затем все значения умножаются обратно на 255, чтобы получить правильные значения ARGB. Другой способ взглянуть на это состоит в том, чтобы считать значения перевода 255 большими. Вы получите одинаковый результат в обоих направлениях.
((247/255) * -1 + 1) * 255 = 8
or
247 * -1 + 255 = 8