Преобразование значения RGB в ColorMatrix

Я хотел бы раскрасить черно-белое изображение.

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

1,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
1,0,0,0,0,

Теперь я хотел бы выбрать цвет из таблицы цветов, например из такой таблицы цветов:

введите здесь описание изображения

Мой план состоял в том, чтобы использовать GetPixel для получения цвета под курсором и преобразования этого значения RGB в ColorMatrix.

Когда я использовал бы GetPixel вместо красного цвета, я бы получил

R: 255
G: 0
B: 0

Как я могу превратить красное значение 255 в значение ColorMatrix? Было бы 1.0. Если бы красное значение было 127, значение было бы 0,5.

Должен ли я просто использовать «правило трех» для определения значения 1,0 или как с этим справиться?


person tmighty    schedule 28.05.2018    source источник


Ответы (1)


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

Посмотрим на вашу матрицу:

1,0,0,0,0
0,1,0,0,0
0,0,1,0,0
0,0,0,1,0
1,0,0,0,0

Эта матрица масштабирует красный, зеленый, синий и альфа-компоненты на 1, а затем добавляет 1 к красному компоненту и 0 к зеленому, синему и альфа-компонентам.

Я не думаю, что это действительно то, чего вы хотите. Чтобы раскрасить изображение, я думаю, было бы лучше умножить значения RGB вашего изображения, а не добавлять к ним. В противном случае, если бы у вас было черно-белое изображение с пикселем, который был белым (т.е. RGB 1, 1, 1), то, когда вы попытались бы его раскрасить, оно осталось бы белым, когда оно действительно должно было бы принять цвет, который вы к нему применяете. .

Давайте взглянем на матрицу в более общем виде, чтобы увидеть, как она влияет на цвета пикселей:

Sr,  0,  0,  0, 0
 0, Sg,  0,  0, 0
 0,  0, Sb,  0, 0
 0,  0,  0, Sa, 0
Tr, Tg, Tb, Ta, 1

S означает «масштаб», а T — перевод. Ваш красный компонент будет умножен на Sr, а затем к нему будет добавлено Tr, ваш зеленый компонент будет умножен на Sg, а затем к нему будет добавлено Tg, ваш синий компонент будет умножен на Sb, а затем к нему будет добавлено Tb, и ваш альфа-компонент будет умножен на Sa, а затем к нему будет добавлено Ta.

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

Color colour = colourDialog.Color; // Or wherever you get your Color instance from
float[][] colourMatrixElements =
{
    new float[] { colour.R / 255.0f, 0, 0, 0, 0 },
    new float[] { 0, colour.G / 255.0f, 0, 0, 0 },
    new float[] { 0, 0, colour.B / 255.0f, 0, 0 },
    new float[] { 0, 0, 0, 1, 0 },
    new float[] { 0, 0, 0, 0, 1 }
};
var colourMatrix = new ColorMatrix(colorMatrixElements);

Теперь вы можете использовать ColorMatrix, чтобы раскрасить изображение.

person Sam    schedule 28.05.2018
comment
Как получить обратную матрицу RGB, как указано в вопросах. 4х4 - person Qamar; 17.12.2019