Разъяснение о том, как работают преобразования ColorMatrix - PullRequest
7 голосов
/ 23 февраля 2011

Я работаю над приложением для обработки изображений (для развлечения) и изо всех сил пытаюсь полностью понять, как работают преобразования 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 Ответ

3 голосов
/ 24 февраля 2011

Вы правы, что нижняя строка предназначена для перевода.В своем комментарии Ганс говорит, что здесь задействован масштабный коэффициент 255, что, вероятно, и смущает вас.Один из способов взглянуть на это состоит в том, что все значения ARGB сначала делятся на 255, затем применяется умножение матриц, а затем все значения умножаются обратно на 255, чтобы получить правильные значения ARGB.Другой способ взглянуть на это состоит в том, чтобы считать значения перевода 255 большими.Вы получите одинаковый результат в обоих направлениях.

((247/255) * -1 + 1) * 255 = 8
or
247 * -1 + 255 = 8
...