неправильный RGB -> Grayscale (либо RGB -> HSV)

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение Proxy » 05.01.2011 (Ср) 17:45

Всегда считал, что из 24битного RGB существует только один верный способ преобразования в 8bit grayscale:
Grayscale = (R+G+B)/(255^3)
Но притом знал, что часто используются особенности восприятия зелёного цвета человеческим глазом (например в некоторых мониторах, пиксел проще делать квадратной формы, т.е. из 4-пикселов, т.е. 1 лишний и использовался он для более точной передачи зелёной компоненты. Или аналогично в фотокамерах и цветных электронных табло, а также это свойство использовалось во многих алгоритмах сжатия с потерями: потери зелёной компоненты наименее желательны). Это всё сводится к анатомической особенности глаза.
Но: никак не считал, что в переводе в grayscale из RGB и CMYK кто-то зачем-то попытается это применить.
И так: печатаем страницу пробной печати в kubuntu. Смотрим на шкалы R, G и B. На этих шкалах самый левый интервал — это 0x000000, далее 0xFFFFFF и градации до 0xFF0000 для R, до 0x00FF00 для G и до 0x0000FF для шкалы B. Представили, да? *
Печатаем, смотрим на лист (притом не забываем как цветной принтер получает цвета, смешивая cyan, magenta, yellow и black), накладываем на лист с 2-х сторон 2 листа белой бумаги, чтобы получить только столбец с интервалом 50% для каждой из шкал. Выходит, что все 3 компоненты при 50% интенсивности (не буду говорить пока про Value или Brightness, и да, я ни в коем случае не про насыщенность говорю, именно про восприятие глазом) воспринимаются одинаково яркими. До сюда вроде всё довольно очевидно и не представляется иных путей. Т.е. как бы логичным кажется, что при чистой краске (соответствующей CMYK) для 0x008000 струйный принтер наносит капли краски в пределах пиксела с "густотой" (не вдаваясь в разницу технологий) в 2 раза меньше, чем, скажем при 0x00FF00, но увы и ах... Зависимость нелинейна. Зачем всё это нужно? Печатаем, наслаждаемся "правильными цветами", фотопринтер сам сделает всю работу по подбору "правильного" цвета.
Но: печатаем ту же самую страницу на лазерном принтере (не цветной, печатает только градации серого от белого (где тонер вообще не наносится) до насыщенного чёрного) и вот тут возникает глюк. Для перевода цветного изображения в grayscale тут следовало просто вычислить (R+G+B)/(255^3), т.к. brightness на готовом листе будет полностью соответствовать "воспринимаемому глазом brightness" (вот как-то так), но увы и ах... Накладываем аналогично 2 белых листа (чтобы повысить чистоту эксперимента т.к. есть ещё и периферическое зрение, которое тоже влияет на восприятие) и видим, что интенсивность нанесения тонера для цветов с одинаковой по задумке brightness различна. Т.е. R-50% и B-50% имеют одинаковый цвет (как и должно быть), а G-50% значительно ярче. Вся шкала G "стянута" к началу, т.е. не линейная, а ближе к экспоненциальной. Лично я мало вникал в работу с принтером, подозреваю, что в grayscale цветное изображение должно конвертироваться софтварно, чтобы избежать нерациональной нагрузки на интерфейс и избыточного расхода времени на печать (прорисовку образа контроллером принтера). Т.е. принтер получает PostScript с уже серым изображением, если в свойствах принтера явно указано, что он цветное изображение печатать ну не умеет (поправьте меня, если я не прав). Т.е. конвертируется драйвером принтера. Ну и естественно по формуле (R+G+B)/(255^3) должно бы. Но для чего тогда вместо (R+G+B)/(255^3) использовать что-то иное в данном случае? Да и если бы это делал сам принтер, то (R+G+B)/(255^3) самый очевидный способ, кмк.
Так вот к чему я это всё: если у Вас вдруг возникла необходимость печати изображения на чёрно-белом принтере (за неимением иного, допустим) необходимо изображение перевести в grayscale вручную, с помощью того же Gimp`a или средствами ПО, которым вы "выводите на печать", любой офисный пакет это умеет сам. Возможно это справедливо только для kubuntu, более детально не изучил пока. Но во всяком случае иначе у меня канал green уродуется.

*что-то типа как тут, но только наизнанку что ли от чёрного к насыщенному цвету.
Последний раз редактировалось Anonymous 05.01.2011 (Ср) 18:14, всего редактировалось 1 раз.
Follow the white rabbit.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение BV » 05.01.2011 (Ср) 18:08

Сколько буковок, а все из-за незнания правильной формулы перевода rgb в grayscale.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение Proxy » 05.01.2011 (Ср) 18:17

BV писал(а):Сколько буковок, а все из-за незнания правильной формулы перевода rgb в grayscale.

Незнания мной или незнания создателем драйвера принтера или может производителем самого принтера? Почему и зачем R-50% и G-50% для цветного принтера имеют на выходе одинаковую яркость, а для чёрно-белого принтера совсем различную? Или может кто-то возьмётся утверждать, что это нормально :D ?
Можно использовать 0.30*R+0.59*G+0.11*B с поправкой на физиологию (емнип в JPEG такое учитывалось), но как видно из написанного мною выше — применимо не всегда. У лазерного принтера нет никакой физиологии человеческого глаза и для того, чтобы покрывать бумагу тонером (одноцветным, ага) ему вовсе не эти коэффициенты нужны. Человек же не различает в 2 "разных" серых пикселах что подразумевалось в них до перевода в серый цвет. Выходит что-то вроде двойной корректировки, что приводит к искажению. Пользователь желает на листе бумаги видеть нечто близкое к тому, что видит на мониторе (т.к. монитор тоже сам корректирует цвета при выводе, что есть "оригинал" для пользователя).
К тому же разве устройства ввода сами не корректируют цветовую гамму в "чистую"? Фотоаппарат к примеру. Т.е. светло-зелёный и светло-красный квадраты (которые в оригинале имеютодинаковую яркость, скажем даже машинную, а не анатомическую) будут ли в цифровом виде иметь одинаковую яркость (машинную т.е, т.е. где все цветовые компоненты равноправны)? Т.е. к примеру 0x008000 зелёный квадрат и 0x800000 красный квадрат с такой же машинной яркостью?
ЗЫ. под равной "машинной" яркостью я подразумеваю например, что если при одинаковом освещении поверхности разных по цвету квадратов отражая свет на фоторезистор (без светофильтра) вызывали бы в нём одно и тоже значение сопротивления, то они равные по "машинной" яркости. Т.е. естественно глазом это воспринимается иначе, чем фоторезистором.
Последний раз редактировалось Anonymous 05.01.2011 (Ср) 18:45, всего редактировалось 1 раз.
Follow the white rabbit.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение alibek » 05.01.2011 (Ср) 18:39

Proxy, как ты думаешь, для чего делается калибровка мониторов, принтеров и сканеров?
Lasciate ogni speranza, voi ch'entrate.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение Proxy » 05.01.2011 (Ср) 18:51

alibek писал(а):Proxy, как ты думаешь, для чего делается калибровка мониторов, принтеров и сканеров?

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

* возможно я заблуждаюсь в том, что устройства ввода корректируют гамму. Если это не так и в электронном виде остаётся актуальным "машинное" восприятие яркости (выше я писал кое-что про фоторезистор для примера), то всё так и должно быть.
В любом случае преобразование из "машинного" в "анатомическое" должно производиться однократно. В моём понимании программные RGB 0x800000 и 0x008000 должны с поверхности монитора восприниматься человеческим глазом как равные по яркости (разумеется и при печати в ч/б принтере тоже, не как в моём случае). Т.е. корректироваться монитором, т.е. в электронном виде имеем "машинную" яркость, а на выходе монитора (или принтера) "анатомическую", но вводиться без изменений (в "машинном" восприятии) устройствами ввода. Фух, запутался! Если же это производится и устройством ввода (фотоаппарат) и затем устройством вывода (принтер), то однозначно возникнет искажение.

ЗЫ. А у всех ли одинаковое восприятие цвета? Ну в смысле если перед 2 людьми положить как бы равные по яркости разноцветные квадраты (оцененные по ощущениям одного человека), то для обоих ли они окажутся равными по яркости? Может дальтонизм не дискретен и бывает маленько более и маленько менее дальтоник? :D
Follow the white rabbit.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение iGrok » 05.01.2011 (Ср) 20:02

Proxy писал(а):Может дальтонизм не дискретен и бывает маленько более и маленько менее дальтоник? :D

В человеке нет и быть не может ничего дискретного.
Кроме, пожалуй, "почти беременна", и "почти мёртв" + наличия/отсутствия каких-либо органов или частей тела.
label:
cli
jmp label

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение Alec » 05.01.2011 (Ср) 21:17

iGrok писал(а):В человеке нет и быть не может ничего дискретного.

ИМХО, глаз видит очень даже дискретными палочками и колбочками... Да и слышит, в принципе, тоже дискретно, исходя из строения уха...
Иногда лучше вовремя остановиться...
И начать заново!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: неправильный RGB -> Grayscale (либо RGB -> HSV)

Сообщение iGrok » 05.01.2011 (Ср) 21:29

Alec писал(а):
iGrok писал(а):В человеке нет и быть не может ничего дискретного.

ИМХО, глаз видит очень даже дискретными палочками и колбочками... Да и слышит, в принципе, тоже дискретно, исходя из строения уха...

Ну, да, а ещё дискретные молекулы и атомы. Согласен, на таком уровне некая дискретность наблюдается. А что насчёт "слышит дискретно" - это я как-то не очень понял. В каком это смысле?
label:
cli
jmp label


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 35

    TopList