![]() |
*Теория* | Умное разукрашивание, RGB в градацию серого
Вот такой момент. Хочу некое изображение (теоретически, число цветов ограничено 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В |
Согласно книжке В.Порева "Компьютерная графика" ("БХВ-Петербург", 2004), белый цвет получается при соотношениях R, G, B - компонент 1 : 4.5907 : 0.0601. Если нормировать это отношение так, чтобы доли цветов в сумме давали единицу, получится 0,17697 : 0,81240 : 0,01063.
|
Чего-то я зашился. Уфф. А как "Яркость" из примеров вида Y= 0.2125R + 0.7154G + 0,0721В соотносится с яркостью из цветовой модели HSB?
|
hasherfrog
Плохо. В HSB яркость определяется по максимальной компоненте из R, G и B: http://en.wikipedia.org/wiki/HSV_color_space Я вообще ничерта не понимаю в моделях представления цвета, но люблю ссылаться на википедию). |
Вот тут чувак чего-то накрутил... http://alienryderflex.com/hsp.html
Маленькие картинки у него ничего так смотрятся... С квадратиками... Но не совсем ясно, своё это вычисленное P он потом применяет как Y для серого (RBG[Y,Y,Y]) ???... Зачем ему тогда получать H и S в RGBtoHSP() ? :-/ |
Народ. А нельзя ли, постаратся, ссылки, на рускоязычные сайты давать. I am bad read to english. :( Я и русский то, через пень колоду. И как люди, не читающие по английски, смогут учавствовать в базаре.
Вообще-то форум русский... |
Diseased Head
Если для кого-то составляет трудность выучить английский в минимальном объёме со словарём (а больше для чтения технических документов и не требуется, хотя и желательно), то ему вероятно не стоит заниматься программированием. 95% полезной документации доступно только на английском. Лет через 10-15, наверное то же самое можно будет сказать про индийский/арабский/китайский. Слава богу, мы пока до такого не докатились. |
Согласен что надо выучить. Ээх... Много чего надо. Просто я подобную инфу где-то видел на русском.
|
Пытаюсь обобщить:
1. простейшее цветовое преобразование можно выполнить как линейное - через матрицу 3x3. Какое бы не придумали преобразование, в линейном приближении оно этой матрицей всегда выразится. 2. В фотошопе есть 2 варианта сделать изображение чёрно-белым. 1) desaturate (изображение-редактирование) 2) создать новый слой, закрасить серым цветом и сделать режим соединения "color". Во втором варианте, на мой взгляд, всё выглядит гораздо естественней. Там используется нелинейное преобразование. Количество операций нисколько не больше, и скорость выполнения мне тоже нравится. |
pva
А принцип действия (пункта 2)?.. По моей ссылке выше мужик пытался (насколько я понял) как раз что-то такое воссоздать... |
pva
Да ты бы и 1 пункт разъяснил бы. Зачем тут матричные преобразования? |
hasherfrog
Принцип действия пункта 2 (в соответствии со ссылочкой из alienryderflex.com) исчерпывается приведенной там формулой. По смыслу он примерно такой: цвет, выраженный через компоненты RGB, рассматривается как вектор в трехмерной оси координат, и нужная интенсивность серого цвета берется как длина этого вектора. Правда, с учетом нормировки по каждому цвету, которая учитывает чувствительность к нему человеческого глаза. |
XPEHOMETP
Я не совсем про это (формулу). Я про то, что мужик пытался понять, как работает RGB->Серый в Photoshop'е. pva сказал, что есть 2 варианта, но как они в формулы переводятся? В Photoshop'е (я не про ту, что парень этот вывел). Я не понимаю пока. |
Значит, про матрицы: любое линейное преобразование в 3-мерном пространстве x1={R1,G1,B1}->x2={R2,G2,B2} можно выразить в виде x2 = A.x1, где A - это матрица 3x3, а . - скалярное произведение. Всего 9 + 6 операций. Это вариант №1 (desaturate). Здесь можно придумать любое правило, например, перевод в оттенки розового или от розового к синему. Всё выразится одной матрицей
В фотошопе (неправильно выразился, конечно) я хотел обратить внимание на скорость выполнения. Формулы можно получить просто. Нарисовать картинку в полутонах, закрасить каким надо цветом, сохранить закрашенную и оригинал. Разложить в ряд тейлора получившееся преобразование и получатся нужные коэффициенты. |
pva
Насчёт матриц... можно совсем подробнее? Код:
| r1 | | a1 a2 a3 | | r2 | Если да, то как выводятся r2,g2,b2? Я совершенно не помню. Напишите формулы? И как обстоят дела с нормированием значений в этом случае? Ведь r2 может получиться > 256 - и что тогда? |
Я бы для понятности чуть-чуть перерисовал картинку:
Код:
x2[i] = sum[A[i, j]*x1[j], {j, 1, 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 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 теперь все точки попадут в тот же куб. |
Вот вам, ПОЛУЧИТЕ.
Русскоязычные сайты. О цветовых моделях и не только. || || || || || \/ \/ \/ \/ \/ http://coop.chuvashia.ru/kartuzov/mg...hing/index.htm http://www.webmascon.com/archive/topic.asp?id=10 http://www.uran.donetsk.ua/~masters/...rary/index.htm http://doc.woweb.ru/index.htm/c/649 http://www.gotdotnet.ru/Forums/Windows/262965.aspx http://corel.demiart.ru/painter/Core...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? =) |
Кстати, операция 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. В резултате получается: три умножения и одно деление, против трёх умножений на числа с плавающей точкой. Немного, но всё-же быстрее. |
Цитата:
Да, действительно. В Кореле тоже самое. Красный и зелёный становятся одинаковыми. А при RGB->Grayscale - разными. Ok, всем спасибо. P.S. Я попробую через афинные преобразования... |
Цитата:
|
Цитата:
|
Ой, блин. Ssory. Я на C проверял. Забыл что на скрипте. Чёт, думал просто на яве (беломор канал, парламент и пр. :grin: ).
Конечно же: скорость выполнения алгоритма зависит, также, от среды в которой он выполняется. Вот кстати ещё, интересная (на мой взгляд), ссылочка ---> http://www.brucelindbloom.com О цветовых моделях. Чёт я совсем запутался. :wacko: |
Время: 03:41. |
Время: 03:41.
© OSzone.net 2001-