Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Теория* | Умное разукрашивание, RGB в градацию серого

Ответить
Настройки темы
*Теория* | Умное разукрашивание, RGB в градацию серого

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85


Конфигурация

Профиль | Отправить PM | Цитировать


Вот такой момент. Хочу некое изображение (теоретически, число цветов ограничено 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

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:37, 02-11-2006 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


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

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 01:51, 03-11-2006 | #12


Ветеран


Сообщения: 1848
Благодарности: 146

Профиль | Отправить PM | Цитировать


hasherfrog

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

Отправлено: 10:31, 03-11-2006 | #13


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 10:51, 03-11-2006 | #14

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
| r1 |   | a1 a2 a3 |   | r2 |
| g1 | . | b1 b2 b3 | = | g2 |
| b1 |   | c1 c2 c3 |   | b2 |
Так?
Если да, то как выводятся r2,g2,b2? Я совершенно не помню. Напишите формулы?

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

Отправлено: 15:40, 03-11-2006 | #16

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить 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 |
Для того, чтобы задать матрицу, преобразования, нужно знать исходный и конечный реперы, то есть 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
теперь все точки попадут в тот же куб.

Отправлено: 10:35, 04-11-2006 | #17


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить 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


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить 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


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:45, 08-11-2006 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » *Теория* | Умное разукрашивание, RGB в градацию серого

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Перевод рисунка из ч/б в RGB Yez Программное обеспечение Windows 5 21-03-2008 22:47
кто работал с отттенками цвета rgb? E-mail Вебмастеру 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




 
Переход