|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Теория* | Умное разукрашивание, RGB в градацию серого |
|
*Теория* | Умное разукрашивание, RGB в градацию серого
|
Старый параноик Сообщения: 2423 |
Вот такой момент. Хочу некое изображение (теоретически, число цветов ограничено 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) |
|
Отправлено: 01:25, 01-11-2006 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать pva
А принцип действия (пункта 2)?.. По моей ссылке выше мужик пытался (насколько я понял) как раз что-то такое воссоздать... |
Отправлено: 23:37, 02-11-2006 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать pva
Да ты бы и 1 пункт разъяснил бы. Зачем тут матричные преобразования? |
------- Отправлено: 01:51, 03-11-2006 | #12 |
Ветеран Сообщения: 1848
|
Профиль | Отправить PM | Цитировать hasherfrog
Принцип действия пункта 2 (в соответствии со ссылочкой из alienryderflex.com) исчерпывается приведенной там формулой. По смыслу он примерно такой: цвет, выраженный через компоненты RGB, рассматривается как вектор в трехмерной оси координат, и нужная интенсивность серого цвета берется как длина этого вектора. Правда, с учетом нормировки по каждому цвету, которая учитывает чувствительность к нему человеческого глаза. |
Отправлено: 10:31, 03-11-2006 | #13 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать XPEHOMETP
Я не совсем про это (формулу). Я про то, что мужик пытался понять, как работает RGB->Серый в Photoshop'е. pva сказал, что есть 2 варианта, но как они в формулы переводятся? В Photoshop'е (я не про ту, что парень этот вывел). Я не понимаю пока. |
Отправлено: 10:51, 03-11-2006 | #14 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Значит, про матрицы: любое линейное преобразование в 3-мерном пространстве x1={R1,G1,B1}->x2={R2,G2,B2} можно выразить в виде x2 = A.x1, где A - это матрица 3x3, а . - скалярное произведение. Всего 9 + 6 операций. Это вариант №1 (desaturate). Здесь можно придумать любое правило, например, перевод в оттенки розового или от розового к синему. Всё выразится одной матрицей
В фотошопе (неправильно выразился, конечно) я хотел обратить внимание на скорость выполнения. Формулы можно получить просто. Нарисовать картинку в полутонах, закрасить каким надо цветом, сохранить закрашенную и оригинал. Разложить в ряд тейлора получившееся преобразование и получатся нужные коэффициенты. |
Отправлено: 15:19, 03-11-2006 | #15 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать pva
Насчёт матриц... можно совсем подробнее? Так? Если да, то как выводятся r2,g2,b2? Я совершенно не помню. Напишите формулы? И как обстоят дела с нормированием значений в этом случае? Ведь r2 может получиться > 256 - и что тогда? |
Отправлено: 15:40, 03-11-2006 | #16 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Я бы для понятности чуть-чуть перерисовал картинку:
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 | Допустим, мы берём исходный репер: {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. | 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 теперь все точки попадут в тот же куб. |
Отправлено: 10:35, 04-11-2006 | #17 |
![]() Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать Вот вам, ПОЛУЧИТЕ.
Русскоязычные сайты. О цветовых моделях и не только. || || || || || \/ \/ \/ \/ \/ 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? ![]() |
------- Отправлено: 12:38, 04-11-2006 | #18 |
![]() Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать Кстати, операция 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. В резултате получается: три умножения и одно деление, против трёх умножений на числа с плавающей точкой. Немного, но всё-же быстрее. |
------- Отправлено: 23:58, 07-11-2006 | #19 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Цитата:
Да, действительно. В Кореле тоже самое. Красный и зелёный становятся одинаковыми. А при RGB->Grayscale - разными. Ok, всем спасибо. P.S. Я попробую через афинные преобразования... |
|
Отправлено: 09:45, 08-11-2006 | #20 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Перевод рисунка из ч/б в RGB | Yez | Программное обеспечение Windows | 5 | 21-03-2008 22:47 | |
кто работал с отттенками цвета rgb? | Вебмастеру | 2 | 07-11-2006 22:35 | ||
[решено] Разукрашивание сайтов по-своему, подменой CSS и Классов | hasherfrog | Вебмастеру | 16 | 20-10-2006 01:21 | |
*Теория* | Кодогенерация | Vlad Drakula | Программирование и базы данных | 6 | 28-08-2006 06:49 | |
ТЕОРИЯ | german r | Мобильные ОС, смартфоны и планшеты | 5 | 07-02-2003 09:42 |
|