Поскольку stackoverflow - это wikipedia + reddit, я хотел сохранить эти знания, пока они не были потеряны навсегда.
Пол Хэберли
Ноябрь 1993 г.
Введение
Матрицы четыре на четыре обычно используются для преобразования геометрии для 3D-рендеринга. Эти матрицы также могут использоваться для преобразования цветов RGB, для масштабирования цветов RGB и для управления оттенком, насыщенностью и контрастом. Наиболее важным преимуществом использования матриц является то, что любое количество преобразований цвета может быть составлено с использованием стандартного умножения матриц.
Обратите внимание, что для того, чтобы эти операции были правильными, мы действительно должны работать с линейными значениями яркости. Если входное изображение находится в нелинейном пространстве яркости, цвета RGB должны быть преобразованы в линейное пространство перед использованием этих матричных операций.
Преобразование цвета
Цвета RGB преобразуются матрицей четыре на четыре, как показано здесь:
xformrgb(mat, r, g, b, tr, tg, tb)
float mat[4][4];
float r,g,b;
float *tr,*tg,*tb;
{
*tr = r*mat[0][0] + g*mat[1][0] + b*mat[2][0] + mat[3][0];
*tg = r*mat[0][1] + g*mat[1][1] + b*mat[2][1] + mat[3][1];
*tb = r*mat[0][2] + g*mat[1][2] + b*mat[2][2] + mat[3][2];
}
Личность
Это единичная матрица:
float mat[4][4] = {
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0,
};
Преобразование цветов с помощью матрицы идентичности оставит их неизменными.
Изменение яркости
Для масштабирования цветов RGB используется такая матрица:
float mat[4][4] = {
rscale, 0.0, 0.0, 0.0,
0.0, gscale, 0.0, 0.0,
0.0, 0.0, bscale, 0.0,
0.0, 0.0, 0.0, 1.0,
};
Где rscale, gscale и bscale указывают, насколько масштабировать компоненты цветов r, g и b. Это можно использовать для изменения цветового баланса изображения.
Фактически, это вычисляет:
tr = r*rscale;
tg = g*gscale;
tb = b*bscale;
Преобразование в яркость
Для преобразования цветного изображения в черно-белое изображение используется такая матрица:
float mat[4][4] = {
rwgt, rwgt, rwgt, 0.0,
gwgt, gwgt, gwgt, 0.0,
bwgt, bwgt, bwgt, 0.0,
0.0, 0.0, 0.0, 1.0,
};
Где
- rwgt составляет 0,3086
- gwgt - 0.6094
- bwgt составляет 0,0820
Это вектор яркости. Обратите внимание, что мы не используем стандартные веса NTSC 0,299, 0,587 и 0,114. Веса NTSC применимы только к цветам RGB в цветовом пространстве гамма 2.2. Для линейных цветов RGB лучше использовать значения, указанные выше.
Фактически, это вычисляет:
tr = r*rwgt + g*gwgt + b*bwgt;
tg = r*rwgt + g*gwgt + b*bwgt;
tb = r*rwgt + g*gwgt + b*bwgt;
Изменение насыщенности
Для насыщения цветов RGB используется такая матрица:
float mat[4][4] = {
a, b, c, 0.0,
d, e, f, 0.0,
g, h, i, 0.0,
0.0, 0.0, 0.0, 1.0,
};
Если константы получены из значения насыщенности s, как показано ниже:
a = (1.0-s)*rwgt + s;
b = (1.0-s)*rwgt;
c = (1.0-s)*rwgt;
d = (1.0-s)*gwgt;
e = (1.0-s)*gwgt + s;
f = (1.0-s)*gwgt;
g = (1.0-s)*bwgt;
h = (1.0-s)*bwgt;
i = (1.0-s)*bwgt + s;
Одним из хороших свойств этой матрицы насыщенности является то, что сохраняется яркость входных цветов RGB. Эту матрицу также можно использовать для дополнения цветов изображения, задав значение насыщенности -1,0.
Обратите внимание, что когда s установлено в 0,0, матрица в точности преобразована в матрицу яркости, описанную выше. Когда s установлено в 1.0, матрица становится тождественной. Все матрицы насыщения могут быть получены путем интерполяции между этими двумя матрицами или экстраполяции за их пределы.
Более подробно это обсуждается в примечании на Обработка изображений с помощью интерполяции и экстраполяции.
Применение смещений к цветовым компонентам
Эта матрица используется для смещения компонентов цветов r, g и b в изображении:
float mat[4][4] = {
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
roffset,goffset,boffset,1.0,
};
Это можно использовать вместе с масштабированием цвета для изменения контрастности изображений RGB.
Простое вращение оттенка
Чтобы повернуть оттенок, мы выполняем трехмерное вращение цветов RGB вокруг диагонального вектора [1.0 1.0 1.0]. Матрица преобразования выводится, как показано здесь:
Если у нас есть функции:
identmat(mat): это создает единичную матрицу.
xrotatemat(mat,rsin,rcos): умножает матрицу, вращающуюся вокруг оси x (красной).
yrotatemat(mat,rsin,rcos): умножает матрицу, вращающуюся вокруг оси y (зеленая).
zrotatemat(mat,rsin,rcos): умножает матрицу, вращающуюся вокруг оси z (синей).
Тогда матрица, которая вращается вокруг диагонали 1.0, 1.0, 1.0, может быть построена следующим образом:
Сначала делаем единичную матрицу
identmat(mat);
Поверните серый вектор на положительный Z
mag = sqrt(2.0);
xrs = 1.0/mag;
xrc = 1.0/mag;
xrotatemat(mat, xrs, xrc);
mag = sqrt(3.0);
yrs = -1.0/mag;
yrc = sqrt(2.0)/mag;
yrotatemat(mat, yrs, yrc);
Поверните оттенок
zrs = sin(rot*PI/180.0);
zrc = cos(rot*PI/180.0);
zrotatemat(mat, zrs, zrc);
Верните серый вектор на место
yrotatemat(mat, -yrs, yrc);
xrotatemat(mat, -xrs, xrc);
Результирующая матрица будет вращать оттенок входных цветов RGB. Поворот на 120,0 градусов точно преобразует красный в зеленый, зеленый в синий и синий в красный. У этого преобразования есть одна проблема, однако яркость входных цветов не сохраняется. Это можно исправить с помощью следующего уточнения:
Вращение оттенка с сохранением яркости
Составляем единичную матрицу
идентмат (ммат);
Поверните серый вектор на положительный Z
mag = sqrt(2.0);
xrs = 1.0/mag;
xrc = 1.0/mag;
xrotatemat(mmat, xrs, xrc);
mag = sqrt(3.0);
yrs = -1.0/mag;
yrc = sqrt(2.0)/mag;
yrotatemat(mmat, yrs, yrc);
matrixmult(mmat, mat, mat);
Срежьте пространство, чтобы плоскость яркости стала горизонтальной.
xformrgb(mmat,rwgt,gwgt,bwgt,&lx;,&ly;,&lz;);
zsx = lx/lz;
zsy = ly/lz;
zshearmat(mat,zsx,zsy);
Поверните оттенок
zrs = sin(rot*PI/180.0);
zrc = cos(rot*PI/180.0);
zrotatemat(mat,zrs,zrc);
Снимите пространство, чтобы вернуть плоскость яркости
zshearmat(mat,-zsx,-zsy);
Верните серый вектор на место
yrotatemat(mat, -yrs, yrc);
xrotatemat(mat, -xrs, xrc);
Вывод
Я представил несколько матричных преобразований, которые можно применить к цветам RGB. Каждое преобразование цвета представлено матрицей 4 на 4, аналогичной матрицам, обычно используемым для преобразования трехмерной геометрии.
Эти преобразования позволяют индивидуально настраивать контраст, яркость, оттенок и насыщенность изображения. Кроме того, преобразования цветовой матрицы сцепляются аналогично геометрическим преобразованиям. Любую последовательность операций можно объединить в единую матрицу с помощью умножения матриц.
person
Ian Boyd
schedule
05.11.2020