Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   *Теория* | Умное разукрашивание, RGB в градацию серого (http://forum.oszone.net/showthread.php?t=73805)

hasherfrog 01-11-2006 01:25 505109

*Теория* | Умное разукрашивание, 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)

ivank 01-11-2006 01:55 505114

hasherfrog
Обычно именно просто вычисляют яркость точки. Только три цветовых компоненты дают различный вес. Никто не сошёлся точно с какими коэфициентами входит каждый компонент. Яндекс первой ссылкой даёт такую формулу:
Y= 0.2125R + 0.7154G + 0,0721В

XPEHOMETP 01-11-2006 09:31 505175

Согласно книжке В.Порева "Компьютерная графика" ("БХВ-Петербург", 2004), белый цвет получается при соотношениях R, G, B - компонент 1 : 4.5907 : 0.0601. Если нормировать это отношение так, чтобы доли цветов в сумме давали единицу, получится 0,17697 : 0,81240 : 0,01063.

hasherfrog 01-11-2006 15:55 505392

Чего-то я зашился. Уфф. А как "Яркость" из примеров вида Y= 0.2125R + 0.7154G + 0,0721В соотносится с яркостью из цветовой модели HSB?

ivank 01-11-2006 16:58 505413

hasherfrog
Плохо. В HSB яркость определяется по максимальной компоненте из R, G и B: http://en.wikipedia.org/wiki/HSV_color_space Я вообще ничерта не понимаю в моделях представления цвета, но люблю ссылаться на википедию).

hasherfrog 01-11-2006 17:27 505422

Вот тут чувак чего-то накрутил... http://alienryderflex.com/hsp.html
Маленькие картинки у него ничего так смотрятся... С квадратиками...
Но не совсем ясно, своё это вычисленное P он потом применяет как Y для серого (RBG[Y,Y,Y]) ???...
Зачем ему тогда получать H и S в RGBtoHSP() ? :-/

Diseased Head 01-11-2006 19:49 505480

Народ. А нельзя ли, постаратся, ссылки, на рускоязычные сайты давать. I am bad read to english. :( Я и русский то, через пень колоду. И как люди, не читающие по английски, смогут учавствовать в базаре.
Вообще-то форум русский...

ivank 01-11-2006 21:45 505548

Diseased Head
Если для кого-то составляет трудность выучить английский в минимальном объёме со словарём (а больше для чтения технических документов и не требуется, хотя и желательно), то ему вероятно не стоит заниматься программированием. 95% полезной документации доступно только на английском. Лет через 10-15, наверное то же самое можно будет сказать про индийский/арабский/китайский. Слава богу, мы пока до такого не докатились.

Diseased Head 01-11-2006 22:40 505572

Согласен что надо выучить. Ээх... Много чего надо. Просто я подобную инфу где-то видел на русском.

pva 02-11-2006 20:51 506033

Пытаюсь обобщить:
1. простейшее цветовое преобразование можно выполнить как линейное - через матрицу 3x3. Какое бы не придумали преобразование, в линейном приближении оно этой матрицей всегда выразится.
2. В фотошопе есть 2 варианта сделать изображение чёрно-белым. 1) desaturate (изображение-редактирование) 2) создать новый слой, закрасить серым цветом и сделать режим соединения "color". Во втором варианте, на мой взгляд, всё выглядит гораздо естественней. Там используется нелинейное преобразование. Количество операций нисколько не больше, и скорость выполнения мне тоже нравится.

hasherfrog 02-11-2006 23:37 506083

pva
А принцип действия (пункта 2)?.. По моей ссылке выше мужик пытался (насколько я понял) как раз что-то такое воссоздать...

Diseased Head 03-11-2006 01:51 506116

pva
Да ты бы и 1 пункт разъяснил бы. Зачем тут матричные преобразования?

XPEHOMETP 03-11-2006 10:31 506258

hasherfrog

Принцип действия пункта 2 (в соответствии со ссылочкой из alienryderflex.com) исчерпывается приведенной там формулой. По смыслу он примерно такой: цвет, выраженный через компоненты RGB, рассматривается как вектор в трехмерной оси координат, и нужная интенсивность серого цвета берется как длина этого вектора. Правда, с учетом нормировки по каждому цвету, которая учитывает чувствительность к нему человеческого глаза.

hasherfrog 03-11-2006 10:51 506276

XPEHOMETP
Я не совсем про это (формулу). Я про то, что мужик пытался понять, как работает RGB->Серый в Photoshop'е. pva сказал, что есть 2 варианта, но как они в формулы переводятся? В Photoshop'е (я не про ту, что парень этот вывел). Я не понимаю пока.

pva 03-11-2006 15:19 506445

Значит, про матрицы: любое линейное преобразование в 3-мерном пространстве x1={R1,G1,B1}->x2={R2,G2,B2} можно выразить в виде x2 = A.x1, где A - это матрица 3x3, а . - скалярное произведение. Всего 9 + 6 операций. Это вариант №1 (desaturate). Здесь можно придумать любое правило, например, перевод в оттенки розового или от розового к синему. Всё выразится одной матрицей

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

hasherfrog 03-11-2006 15:40 506451

pva
Насчёт матриц... можно совсем подробнее?

Код:

| r1 |  | a1 a2 a3 |  | r2 |
| g1 | . | b1 b2 b3 | = | g2 |
| b1 |  | c1 c2 c3 |  | b2 |

Так?
Если да, то как выводятся r2,g2,b2? Я совершенно не помню. Напишите формулы?

И как обстоят дела с нормированием значений в этом случае?
Ведь r2 может получиться > 256 - и что тогда?

pva 04-11-2006 10:35 506790

Я бы для понятности чуть-чуть перерисовал картинку:
Код:

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 506836

Вот вам, ПОЛУЧИТЕ.
Русскоязычные сайты. О цветовых моделях и не только.
|| || || || ||
\/ \/ \/ \/ \/

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? =)



Diseased Head 07-11-2006 23:58 508375

Кстати, операция 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 508505

Цитата:

Кстати, операция 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. Я попробую через афинные преобразования...

Diseased Head 10-11-2006 19:46 509867

Цитата:

Цитата hasherfrog
Т.е. N=(M+m)/2, M - max, m - min

Ну да. А я чёт недотюмкал, так формулу преовразовать. Эт, у меня бывает - дырявая голова. :rotate:

pva 10-11-2006 20:03 509878

Цитата:

Немного, но всё-же быстрее.
Diseased Head, на яваскрипте это никуда не стреляет ;)

Diseased Head 11-11-2006 19:57 510233

Ой, блин. Ssory. Я на C проверял. Забыл что на скрипте. Чёт, думал просто на яве (беломор канал, парламент и пр. :grin: ).
Конечно же: скорость выполнения алгоритма зависит, также, от среды в которой он выполняется.

Вот кстати ещё, интересная (на мой взгляд), ссылочка ---> http://www.brucelindbloom.com О цветовых моделях. Чёт я совсем запутался. :wacko:


Время: 03:41.

Время: 03:41.
© OSzone.net 2001-