Показать полную графическую версию : *Теория* | Умное разукрашивание, RGB в градацию серого
hasherfrog
01-11-2006, 01:25
Вот такой момент. Хочу некое изображение (теоретически, число цветов ограничено RBG [0-255,0-255,0-255]) разукрасить градациями некоего цвета. Пусть серого.
Можно просто пересчитать так:
для каждой точки
1. берём [R,G,B] в точке
2. вычисляем a = R+B+G
3. новый цвет n = [a/3,a/3,a/3]
повторить
Но понятно, что многие цвета тогда "сольются".
Может, есть какой-нибудь другой способ? Проблема в том, что он должен быть не очень сложным (считать будем на javascript)
hasherfrog
Обычно именно просто вычисляют яркость точки. Только три цветовых компоненты дают различный вес. Никто не сошёлся точно с какими коэфициентами входит каждый компонент. Яндекс первой ссылкой даёт такую формулу:
Y= 0.2125R + 0.7154G + 0,0721В
XPEHOMETP
01-11-2006, 09:31
Согласно книжке В.Порева "Компьютерная графика" ("БХВ-Петербург", 2004), белый цвет получается при соотношениях R, G, B - компонент 1 : 4.5907 : 0.0601. Если нормировать это отношение так, чтобы доли цветов в сумме давали единицу, получится 0,17697 : 0,81240 : 0,01063.
hasherfrog
01-11-2006, 15:55
Чего-то я зашился. Уфф. А как "Яркость" из примеров вида Y= 0.2125R + 0.7154G + 0,0721В соотносится с яркостью из цветовой модели HSB?
hasherfrog
Плохо. В HSB яркость определяется по максимальной компоненте из R, G и B: http://en.wikipedia.org/wiki/HSV_color_space Я вообще ничерта не понимаю в моделях представления цвета, но люблю ссылаться на википедию).
hasherfrog
01-11-2006, 17:27
Вот тут чувак чего-то накрутил... http://alienryderflex.com/hsp.html
Маленькие картинки у него ничего так смотрятся... С квадратиками...
Но не совсем ясно, своё это вычисленное P он потом применяет как Y для серого (RBG[Y,Y,Y]) ???...
Зачем ему тогда получать H и S в RGBtoHSP() ? :-/
Diseased Head
01-11-2006, 19:49
Народ. А нельзя ли, постаратся, ссылки, на рускоязычные сайты давать. I am bad read to english. :( Я и русский то, через пень колоду. И как люди, не читающие по английски, смогут учавствовать в базаре.
Вообще-то форум русский...
Diseased Head
Если для кого-то составляет трудность выучить английский в минимальном объёме со словарём (а больше для чтения технических документов и не требуется, хотя и желательно), то ему вероятно не стоит заниматься программированием. 95% полезной документации доступно только на английском. Лет через 10-15, наверное то же самое можно будет сказать про индийский/арабский/китайский. Слава богу, мы пока до такого не докатились.
Diseased Head
01-11-2006, 22:40
Согласен что надо выучить. Ээх... Много чего надо. Просто я подобную инфу где-то видел на русском.
Пытаюсь обобщить:
1. простейшее цветовое преобразование можно выполнить как линейное - через матрицу 3x3. Какое бы не придумали преобразование, в линейном приближении оно этой матрицей всегда выразится.
2. В фотошопе есть 2 варианта сделать изображение чёрно-белым. 1) desaturate (изображение-редактирование) 2) создать новый слой, закрасить серым цветом и сделать режим соединения "color". Во втором варианте, на мой взгляд, всё выглядит гораздо естественней. Там используется нелинейное преобразование. Количество операций нисколько не больше, и скорость выполнения мне тоже нравится.
hasherfrog
02-11-2006, 23:37
pva
А принцип действия (пункта 2)?.. По моей ссылке выше мужик пытался (насколько я понял) как раз что-то такое воссоздать...
Diseased Head
03-11-2006, 01:51
pva
Да ты бы и 1 пункт разъяснил бы. Зачем тут матричные преобразования?
XPEHOMETP
03-11-2006, 10:31
hasherfrog
Принцип действия пункта 2 (в соответствии со ссылочкой из alienryderflex.com) исчерпывается приведенной там формулой. По смыслу он примерно такой: цвет, выраженный через компоненты RGB, рассматривается как вектор в трехмерной оси координат, и нужная интенсивность серого цвета берется как длина этого вектора. Правда, с учетом нормировки по каждому цвету, которая учитывает чувствительность к нему человеческого глаза.
hasherfrog
03-11-2006, 10:51
XPEHOMETP
Я не совсем про это (формулу). Я про то, что мужик пытался понять, как работает RGB->Серый в Photoshop'е. pva сказал, что есть 2 варианта, но как они в формулы переводятся? В Photoshop'е (я не про ту, что парень этот вывел). Я не понимаю пока.
Значит, про матрицы: любое линейное преобразование в 3-мерном пространстве x1={R1,G1,B1}->x2={R2,G2,B2} можно выразить в виде x2 = A.x1, где A - это матрица 3x3, а . - скалярное произведение. Всего 9 + 6 операций. Это вариант №1 (desaturate). Здесь можно придумать любое правило, например, перевод в оттенки розового или от розового к синему. Всё выразится одной матрицей
В фотошопе (неправильно выразился, конечно) я хотел обратить внимание на скорость выполнения. Формулы можно получить просто. Нарисовать картинку в полутонах, закрасить каким надо цветом, сохранить закрашенную и оригинал. Разложить в ряд тейлора получившееся преобразование и получатся нужные коэффициенты.
hasherfrog
03-11-2006, 15:40
pva
Насчёт матриц... можно совсем подробнее?
| r1 | | a1 a2 a3 | | r2 |
| g1 | . | b1 b2 b3 | = | g2 |
| b1 | | c1 c2 c3 | | b2 |
Так?
Если да, то как выводятся r2,g2,b2? Я совершенно не помню. Напишите формулы?
И как обстоят дела с нормированием значений в этом случае?
Ведь r2 может получиться > 256 - и что тогда?
Я бы для понятности чуть-чуть перерисовал картинку:
x2[i] = sum[A[i, j]*x1[j], {j, 1, 3}]
| a1 a2 a3 | | r2 |
| r1 g1 b1 | . | b1 b2 b3 | = | g2 |
| c1 c2 c3 | | b2 |
Для того, чтобы задать матрицу, преобразования, нужно знать исходный и конечный реперы, то есть 2 тройки линейно-независимых векторов в 3-мерном пространстве. Тогда матрица будет поворачивать и искажать любой вектор также как эти реперы.
Допустим, мы берём исходный репер: {1,0,0}, {0,1,0}, {0,0,1}, то есть прямоугольный базис, а конечный - {a1,a2,a3}, {b1,b2,b3}, {c1,c2,c3}. Тогда матрица преобразования будет как раз такой, какую мы сипользовали для примера.
Да, выход за границы может быть. Придётся проверять (урезать выходной диапазон) или изменить матрицу так, чтобы куб, построенный на осях {R,G,B} с рёбрами длиной 255 преобразовывался внутрь такого же куба (т.е. наложить изотропно сжимающее преобразование, уменьшающее яркость точек). Может быть ещё один эффект - смещение. Чтобы его избежать (или учесть), используют 4-мерное преобразование:
назовём матрицу A2
| a1 a2 a3 | | r2 |
| r1 g1 b1 | . | b1 b2 b3 | = | g2 |
| c1 c2 c3 | | b2 |
| d1 d2 d3 | | 1. |
то есть просто компенсируют это смещение. Чтобы теперь узнать {d1, d2, d3}, нужно (это делается один раз в жизни, при выводе матрицы):
1. Преобразовать все вершины куба 0-255 (8 штук) матрицей A, построенной на реперах.
2. Найти минимальные и максимальные значения координат Xmin={Rmin, Gmin, Bmin}, Xmax={Rmax, Gmax, Bmax}
3. alpha = max(max(Xmax[i]-Xmin[i], 255), {i,1,3})
4. d[i] = - min(0, Xmin[i])
5. Поделить все компоненты матрицы A на alpha и собрать всё в матрицу A2
теперь все точки попадут в тот же куб.
Diseased Head
04-11-2006, 12:38
Вот вам, ПОЛУЧИТЕ.
Русскоязычные сайты. О цветовых моделях и не только.
|| || || || ||
\/ \/ \/ \/ \/
http://coop.chuvashia.ru/kartuzov/mgr/Articles/3D/ColorMatching/index.htm
http://www.webmascon.com/archive/topic.asp?id=10
http://www.uran.donetsk.ua/~masters/2006/fvti/poltava/library/index.htm
http://doc.woweb.ru/index.htm/c/649
http://www.gotdotnet.ru/Forums/Windows/262965.aspx
http://corel.demiart.ru/painter/CorelPainter8book/Charter3/1.htm
http://mydesignplace.narod.ru/second/3.htm
http://www.greenv.ru/index.html?code=206
http://wwm.com.ua/cgi/p.cgi?a=artful&prid=321&lng=ru
http://www.fos.ru/technic/14320.html
Yourself then, good read to the english, mans? =)
Diseased Head
07-11-2006, 23:58
Кстати, операция desaturate, в Photoshop, выполняется так:
k = Max(R,G,B) - (m = Min(R,G,B)) / 2
N = [k+m,k+m,k+m]
А способ, с созданием нового слоя, в Photoshop, учитывает вес цвета (хотя об этом уже сказали). И он, почти, равносилен переводу изображения в Grayscale.
Используется (приблезительно) такая формула:
K = 0.3 R + 0.59 G + 0.11 B
У меня в книге: "Delphi5 создание мультимедийных приложений", формула яркости, такая же.
Могу предложить следующий алгоритм:
function RGBtoGrayScale(p, size)
{
for(p ; p < p+size ; p = p+3)
p[1] = p[2] = p[3] = (30*p[1] + 59*p[2] + 11*p[3]) / 100;
}
Где: p - указатель на изображение, size - размер изображения.
Так как умножение на число с плавающей точкой, практически, равносильно делению. То я умножил вышепреведённую формулу на дробь 100/100. В резултате получается: три умножения и одно деление, против трёх умножений на числа с плавающей точкой. Немного, но всё-же быстрее.
hasherfrog
08-11-2006, 09:45
Кстати, операция desaturate, в Photoshop, выполняется так:
k = Max(R,G,B) - (m = Min(R,G,B)) / 2
N = [k+m,k+m,k+m]
Т.е. N=(M+m)/2, M - max, m - min
Да, действительно.
В Кореле тоже самое.
Красный и зелёный становятся одинаковыми.
А при RGB->Grayscale - разными.
Ok, всем спасибо.
P.S. Я попробую через афинные преобразования...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.