Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2012, 11:46   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию алгоритм Desaturate (насыщеность)

как бы нам превратить цветную картинку в черно-белую?
ну ScanLine - это понятно... но вот что с ним делать?
по какому алгоритму обрабатывать пиксели?

я вот подумал и решил что это будет среднее арифметическое между
тремя составляющими цвета одного пиксела...

наваял такой вот код:
Код:
for d:=0 to BMP.Height-1 do
begin
Line:=BMP.ScanLine[d];
for i:=0 to BMP.Width-1 do
begin
r:=Line^[i*3];
g:=Line^[i*3+1];
b:=Line^[i*3+2];

m:= Round( (r+g+b)/3   );

Line^[i*3]:=m;
Line^[i*3+1]:=m;
Line^[i*3+2]:=m;
end;
end;
результат дает вполне ожидаемый - картинка стала черно-белой.
непонятно другое: сравнил результат проги и результат фотошопа.
они отличаются. хоть и совсем немного, но отличаются.
у меня в проге картинка получается светлее, чем в фотошопе...
предположил что это может быть связано с использованием Round,
что он 5.5 округлит в 6, а в фотошопе округляется до меньшего,
в результате значния цвета становятся меньше и картинка в целом темнее...
попробовал использовать Trunc вместо Round, но результат тот же...

я вот думаю что операция обесцвечивания картинки должна дать
однозначный результат - черно-белую картинку, причем всегда одинаковую.
а получается что разные программы дают разный результат.
в чем дело? у меня алгоритм неправильный?
xrob вне форума Ответить с цитированием
Старый 25.03.2012, 12:06   #2
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

g = 0.299R + 0.587G + 0.114B
x128 вне форума Ответить с цитированием
Старый 25.03.2012, 12:24   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

что это???
т.е. я понял что это, но почему так сложно?
я имею в виду не реализовать сложно, а сам алгоритм...
откуда берется именно такое соотношение?
xrob вне форума Ответить с цитированием
Старый 25.03.2012, 13:15   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что глаз по разному воспринимает разные цвета.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.03.2012, 13:21   #5
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Такое преобразование учитывает разную чувствительность глаза к красной, зеленой и синей составляющей и в результате яркость изображения воспринимается одинаково.
x128 вне форума Ответить с цитированием
Старый 25.03.2012, 13:47   #6
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

сделал g = 0.299R + 0.587G + 0.114B...
различий еще больше, чем с моим вариантом...


...

ну ладно, с обесцвечиванием разобрались...
а как увеличить насыщенность?

если говорить простым языком, то насыщенность - это когда красный краснее, зеленый зеленее и т.д.
но если просто увеличивать значение цветовых составляющих,
то мы получим осветление картинки (она будет белеть), а не насыщеность

Последний раз редактировалось xrob; 25.03.2012 в 15:49.
xrob вне форума Ответить с цитированием
Старый 25.03.2012, 15:48   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

перенес в предыдущий пост
xrob вне форума Ответить с цитированием
Старый 26.03.2012, 09:47   #8
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

переходи в другое цветовое пространство, на пример HSV
x128 вне форума Ответить с цитированием
Старый 08.04.2012, 09:56   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
а как увеличить насыщенность?

если говорить простым языком, то насыщенность - это когда красный краснее, зеленый зеленее и т.д.
но если просто увеличивать значение цветовых составляющих,
то мы получим осветление картинки (она будет белеть), а не насыщеность
Если говорить простым языком, то насыщенность - это когда цвета сильнее отличаются от среднего. А средний в нашем случае это не черный, а серый.
Т.е. нужно "растаскивать" цвета не от 0, а в разные стороны от некоторого среднего. В качестве этого среднего должен быть серый цвет определенной интенсивности, в качестве которого можно попробовать разные варианты:
- (127,127,127),
- вместо "127" : 0.29R + 0.60G + 0.11B,
- вместо "127" : (R + G + B)/3.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разветвляющийся алгоритм,циклический алгоритм и Многомерные массивы (Pascal) TrapperPTZ Помощь студентам 1 26.01.2012 08:58
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм. iamhated Помощь студентам 1 15.01.2012 16:24
Разработайте алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм iamhated Помощь студентам 1 14.01.2012 16:22
Алгоритм TMDS (Алгоритм передачи данных интерфейса DVI) Pro4RE Помощь студентам 2 24.04.2011 21:55
Волновой алгоритм (алгоритм Ли) MrRockchip Общие вопросы C/C++ 4 10.05.2010 13:26