|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
20.05.2010, 00:24
|
#1
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Изменение параметров цвета
Нужно сделать алгоритм изменения параметра цвета как в фотошопе. Менюшка "Изображение -> Коррекция -> Цветовой тон/Насыщенность". Нужно реализовать эмуляцию трёх ползунков: цветовой тон, насыщенность, яркость. Читал это http://ru.wikipedia.org/wiki/HSV_(цветовая_модель) и это http://ru.wikipedia.org/wiki/HSL - первый алгоритм реализовывал - в принципе работает вроде, но насыщенность ведёт себя не так, как в фотошопе, когда убавляем её на полную, цвет становится черно-белым, но более светлым, чем в фотошопе. Склоняюсь к тому, что надо брать второй алгоритм. Но мне хочется редактировать каждый параметр отдельно, а не производить каждый раз конвертацию RGB -> HSV -> (изменяем нужный параметр H, S или V) -> RGB, чтобы работало быстрее, так как производить операции планируется не только над отдельными цветами, но и над картинками. Формулу изменения яркости, которая ведёт себя подобно фотошоповской я сделал. С цветовым тоном наверняка разберусь. А вот насыщенность никак не получается. Кто-нибудь может помочь? Хотя бы советами, рассуждениями. В инете пробовал искать, на русских сайтах ничего толкового не нашёл, а английский знаю плохо. И тут вдруг подумал, а ведь на булке много умных людей
|
(Offline)
|
|
22.05.2010, 16:31
|
#2
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Изменение параметров цвета
Потыкался в Paint.net
Минимальная насыщенность - R=G=B, оттенки серого. Максимальная - наоборот
Самое простое - при повышении насыщенности посчитать (R+G+B )/3, и если насыщенность надо повысить, то то значение что меньше среднего арифметического, уменьшать, то что больше - увеличивать
А вот как рассчитать, насколько повышать или понижать - не знаю
Глаз воспринимает яркость как логарифм, т.е. оценивает, что и во сколько раз ярче, по-моему, надо поэкспериментировать с разными вариантами и всё
Правда, есть мысль:
dR:=(R+G+B )/3-R
//dR - отличие от средней яркости
dR:=dR*k;
k - коэффициент изменения насыщенности
//при K=0 серые цвета
R:=(R+G+B )/3-dR
Что получится точно не знаю
|
(Offline)
|
|
23.05.2010, 08:33
|
#3
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Изменение параметров цвета
Я тоже по-началу так делал. Но проведя эксперименты в фотошопе и начитавшись литературы понял, что нужно делать (MIN+MAX)/2 , где MIN - значение минимального по уровню канала, а MAX - значение максимального. То есть как уменьшить насыщенность до нижней границы, я разобрался почти сразу. А вот как рассчитать максимальную... В принципе я вроде тоже понял, но не могу формулу вывести. Там получается куча условий и прочей фигни, что по количеству кода получается в два раза больше, чем полное преобразование RGB - HSV (HSL) - RGB. Пока так и сделал. Но хотелось бы разобраться до конца.
|
(Offline)
|
|
25.05.2010, 12:06
|
#4
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Изменение параметров цвета
Выложи формулы, по которым уменьшаешь, я попробую переделать их под увеличение.
P.S. желательно в языке паскаля
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
25.05.2010, 13:29
|
#5
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Изменение параметров цвета
Там разные формулы. Нижняя граница вычисляется по формуле (MIN+MAX)/2, а граница самого насыщенного цвета зависит от нескольких факторов. Во-первых, учитывается то, что каждый из каналов не должен быть менее 0 и более 255. Сначала проверяем что меньше: MIN или (255-MAX). Берём меньшее из них, из значения минимального канала вычитаем это число, а к максимальному его прибавляем (в итоге получается, что либо минимальный станет равен нулю, либо максимальный станет равен 255, то есть за границы [0-255] ни один из них не выйдет). А вот с каналом, который лежит между значениями MIN и MAX, придётся производить отдельную содомию. Тут ща хз как описать попроще. Но короче все эти вычисления уже по коду занимают у меня места больше, чем конвертация RGB - HSV (HSL) - RGB , муть какая-то.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:16.
|