Черно-белая картинка,ДВА цвета

Мутник

Новичок
Черно-белая картинка,ДВА цвета

Подскажите, как средствами gd lib сделать двухцветную картинку из цветной. Именно черно-белую. ТОЛЬКО ДВА ЦВЕТА. иные варианты не подходят.
 

Мутник

Новичок
хм... не знаю... Наверное, что светлее какого то параметра -белое, что темнее - черное.

Может кто то сталкивался с таким...
 

Мутник

Новичок
Нет, для того, чтобы отсылать цветную картинку на моб. телефон, у которого двухцветный экран ;)
 

untied

Сдвинутый новичок
Дык для мобильников с двуцветными мониторами предназначен формат wbmp. Конвертируй.

Если нужно сделать вручную, то вот примерный ход действий:
- каждую точку картинки нужно перевести из модели RGB в Lab (систему перевода можно найти в инете);
- в цветовой модели Lab канал L отвечает за яркость (luminance);
- 0 <= L <= 1 (если я правильно помню);
- если для выбранной точки значение L больше или равно 0, но меньше 0.5, то точка становится черной;
- если значение L больше 0.5, то точка становится белой;
- каналы а и b не используются.

Ну а как превратить полученный массив черных и белых точек в файл .wbmp опять же надо искать в инете.
 

neko

tеam neko
да проще всего имхо сложить компоненты и поделить на 3
или как-нить там в gd редуцировать палитру
наверняка можно
 

SiMM

Новичок
> да проще всего имхо сложить компоненты и поделить на 3
Это grayscale получится, а не BW
untied, твоя схема вообще непригодна - опробуй как нибудь на практике ;)
 

neko

tеam neko
это получится математическая "почти яркость"
(в противоположность оптической)
по которой можно выбрать Ч или Б

все вам разжевывай
 

SiMM

Новичок
neko, а дальше ты предлагаешь, аки untied, сравнивать яркость с 0.5 и делать выводы (BW и grayscale - это не одно и то же)? ;) Может всё же для начала на практике опробуешь этот вариант на паре-сотне картинок, чтобы осознать его несостоятельность?
 

SiMM

Новичок
Ну и как? Я именно про BW, а не grayscale? (про grayscale и так всё понятно - правда, как правило ещё со времён телевидения используют формулу с неодинаковыми коэффициентами).
 

neko

tеam neko
что как?
работает конечно

насчет форумылы см. выше опять таки

-~{}~ 02.02.05 12:30:

правда я не имею дурной привычки на пхп писать обработку графики
 

SiMM

Новичок
Ну не может оно пахать ;) Возьми картинку, состоящую из двух цветов - 0xFF,0xFF,0x00 и 0x00,0xFF,0xFF - и пройдись алгоритмом определения чёрности точки. Ну и что у тебя получится на выходе? Правильно, один белый цвет ;)
 

SiMM

Новичок
neko, там области надо как-то рассматривать. Можно попробовать "чанками" (или как оно называется?). На области с одним цветом (ну можно для этого в grayscale перевести для начала) накладывать определённую маску с заданным соотношением белых/чёрных пикселей. В общем, алгоритм надо явно искать не на форуме по PHP ;)
 

untied

Сдвинутый новичок
Originally posted by SiMM
untied, твоя схема вообще непригодна - опробуй как нибудь на практике ;)
А чего пробовать-то?
Я в Фотошопе регулярно пользуюсь такой схемой для получения контурных изображений при сканировании. Сканируешь картинку на белом фоне в оттенках серого, конвертируешь в Lab, потом редактируешь кривую в канале L (то что ближе к черному -- в ноль, то что ближе к белому -- в 1). Получается контурное изображение на белом фоне. Такой способ отлично отсеивает "шумы" с бумаги.
У кого есть Фотошоп -- можете сами поиграться и убедиться.

Originally posted by SiMM
Ну не может оно пахать Возьми картинку, состоящую из двух цветов - 0xFF,0xFF,0x00 и 0x00,0xFF,0xFF - и пройдись алгоритмом определения чёрности точки. Ну и что у тебя получится на выходе? Правильно, один белый цвет.
Оно не может пахать в модели RGB! Потому что в модели RGB все три компоненты участвуют в определении яркости. А в модели Lab яркость определяется только одной компонентой! А каналы a и b оперируют с понятиями "скорее красный чем зеленый" и "скорее желтый чем синий". Все вам разжевывай!

Есть, кстати, и более простой способ. Я уже потом вспомнил. Есть формула для перевода RGB-компонент в оттенки серого (всё равно остается модель RGB, но все три компоненты равны друг другу).

Т.е. у преобразованной точки R1 = G1 = B1 = F(R0,G0,B0), где F -- функция перевода (если кому надо -- могу поискать, у меня где-то программа на C валяется, делающая такое преобразование).
Потом проверяем, если R1,G1,B1 меньше 128 -- точка черная, если больше 128 -- белая.

Этот подход тоже должен сработать, но, вполне вероятно, с меньшей точностью: так как здесь используется целочисленная арифметика, а при подходе Lab -- с плавающей точкой. Впрочем, на экране мобильника все равно будут те же яйца, только сбоку.

Но проще всего, наверное, обратиться к функции image2wbmp().
 

SiMM

Новичок
untied, ок, объясняю ещё раз (блистать столь модной в этом топике фразой я, пожалуй, не буду ;) ). Вот у тебя есть картинка. Чёрнобелая. В grayscale. Пусть яркость каждой точки определяется числом от 0 до 255. А вот теперь представь такую ситуацию. Я заливаю фон чёрным (цвет 0), и потом пишу на ней цветом 127. При этом в оригинале, в grayscale, ты будешь видеть, что я написал. А теперь пройдись своим алгоритмом по написанному мной тексту и получишь чёрный квадрат Малевича. Так понятнее?
PS: только щас заметил, что точки с цветом 128 у тебя находятся в подвешенном неопределённом состоянии ;)
 

neko

tеam neko
SiMM
мда нашел я свою супер-пупер разработку на эту тему
там диффузией делается, а свосем не так как я предлагал тут :Р
 

untied

Сдвинутый новичок
Originally posted by SiMM
untied, ок, объясняю ещё раз (блистать столь модной в этом топике фразой я, пожалуй, не буду ;) ). Вот у тебя есть картинка. Чёрнобелая. В grayscale. Пусть яркость каждой точки определяется числом от 0 до 255. А вот теперь представь такую ситуацию. Я заливаю фон чёрным (цвет 0), и потом пишу на ней цветом 127. При этом в оригинале, в grayscale, ты будешь видеть, что я написал. А теперь пройдись своим алгоритмом по написанному мной тексту и получишь чёрный квадрат Малевича. Так понятнее?
Ну да, так и должно быть. Точка с цветом 127 скорее черная чем белая. То, что ты имеешь в виду, называется diffusion (апроксимация серого с помощью черных и белых точек). Достаточно сложное занятие для программирования в PHP. Если ты такую штуку реализовал в PHP -- могу только порадоваться за тебя.
А если применить то же самое преобразование к реальной картинке (а не к надуманному примеру), то результат будет намного лучше. Как раз для мобильника.
 
Сверху