Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Конвертация картинки в 1-бит.


Автор: iddqd 8.6.2006, 09:35
В Corel Photo Paint есть такая функция:
Image->Color Mode-Black and White (1-bit)->Conversion: Stucki
Как мне использоваться эту возможность Корела из дельфи или может кто-нибудь знает алгоритм? 

Автор: Snowy 8.6.2006, 09:38
Не у всех есть Corel. Может пояснишь, что это:
Цитата(iddqd @  8.6.2006,  09:35 Найти цитируемый пост)
Conversion: Stucki

 

Автор: Romikgy 8.6.2006, 09:41
Если знаешь цвет каждой точки, то можно сделать так,
сумируем все 3 состовляющие цвета и делим на три, получается градация серого, 
далее елси больше половины от белого , то ставил 1 , меньше 0,
 допустим цвет : 0x800101
серый =( 0x80+0x1+0x1)/3= 0x82/3= 0x2b
ч/б = 0х2b > 0x7f ? 1 : 0 

Автор: Snowy 8.6.2006, 10:05
Тогда уж так:
Код
  bmp.PixelFormat := pf1bit;
 

Автор: iddqd 8.6.2006, 10:46
Цитата(Snowy @  8.6.2006,  09:38 Найти цитируемый пост)
Не у всех есть Corel. Может пояснишь, что это:
Цитата(iddqd @  8.6.2006,  09:35 )    
Conversion: Stucki


Если бы я знал smile
это какой-то вид преобразования картинки. Подробности мне не известны.

Цитата(Snowy @  8.6.2006,  10:05 Найти цитируемый пост)
Тогда уж так:
код Pascal/Delphi    
1:    
  bmp.PixelFormat := pf1bit;


Результат значительно отличается от требуемого.

Цитата(Romikgy @  8.6.2006,  09:41 Найти цитируемый пост)
Если знаешь цвет каждой точки, то можно сделать так,
сумируем все 3 состовляющие цвета и делим на три, получается градация серого, 
далее елси больше половины от белого , то ставил 1 , меньше 0,
 допустим цвет : 0x800101
серый =( 0x80+0x1+0x1)/3= 0x82/3= 0x2b
ч/б = 0х2b > 0x7f ? 1 : 0 


Ты знаком с алгоритмом или это предположение?
Если первое, то можно немного подробней.
 

Автор: drkot 8.6.2006, 11:01
согласен с Snowy,  потому что алгоритм Romikgy однозначно ошибочен. Тама формула посложнее с коэфициентиками и пр. в зависимости от компоненты и их комбинаций (попробуй преобразовать в серый три картинки типа 255R:0G:0B;  0R:255G:0B; 0R:0G:255B; и посмотри что получится)

Добавлено @ 11:03 
Цитата(iddqd @  8.6.2006,  10:46 Найти цитируемый пост)
Результат значительно отличается от требуемого.

А ты уровнем 
Цитата(Romikgy @  8.6.2006,  09:41 Найти цитируемый пост)
ч/б = 0х2b > 0x7f ? 1 : 0

поварьируй.

Добавлено @ 11:05 
А лучше иди на торри там есть библиотеки по обработке изображений, там уже все реализовано, да и подсмотреть как делать можно. 

Автор: Romikgy 8.6.2006, 11:05
Цитата(iddqd @  8.6.2006,  09:46 Найти цитируемый пост)
Ты знаком с алгоритмом

нет
Цитата(iddqd @  8.6.2006,  09:46 Найти цитируемый пост)
это предположение

да
возьми картинку любую , выложи здесь (только не сильно большую),
и сделай в
Цитата(iddqd @  8.6.2006,  08:35 Найти цитируемый пост)
В Corel Photo Paint есть такая функция:Image->Color Mode-Black and White (1-bit)->Conversion: Stucki

и выложи результат, имхо желательно в бмп формате, легче будет разбиратся с алгоритмом

Добавлено @ 11:10 
Цитата(drkot @  8.6.2006,  10:01 Найти цитируемый пост)
попробуй преобразовать в серый три картинки типа 255R:0G:0B;  0R:255G:0B; 0R:0G:255B; и посмотри что получится

для человека картинки будут разные , а цифр имхо одинаковые, это зависит от особеностей человеческого глаза, восприимчивость к цыетовой гамме, 
имхо разговор ведется о другом 

Автор: drkot 8.6.2006, 11:12
Могу предложить простое решение (неправильное но творческое).
Создаеш в кореле лист с градиентной заливкой (примерно такого вида)
   R: 0..255 - первая полоса
   G: 0..255 - вторая полоса
   B: 0..255 - третья полоса
экспортируеш это счастье в бмп24 преобразуеш в 8бит и экспортируеш в бмп8, преобразуеш в 1бит и экспортируеш в бмп1. по полученым результатам можно составить алгоритм преобразования из цвета в монохром (причем алгоритм будет адекватен кореловскому)

Добавлено @ 11:21 
Цитата(Romikgy @  8.6.2006,  11:05 Найти цитируемый пост)
имхо разговор ведется о другом 

а по моему иенно об этом. почитай стандарт jpeg там какраз это и учтено.

берем два прототипа 50%G и 50%R, преобразуем в градации серого получаем 42,7% и 23,5% серого соотбетственно (это в цифре)
Цитата(Romikgy @  8.6.2006,  11:05 Найти цитируемый пост)
 а цифр имхо одинаковые

посему чситаю утверждение ложным.
 

Автор: Romikgy 8.6.2006, 12:00
Цитата(drkot @  8.6.2006,  10:12 Найти цитируемый пост)
почитай стандарт jpeg

к какому боку это относится к теме????
Цитата(drkot @  8.6.2006,  10:12 Найти цитируемый пост)
берем два прототипа 50%G и 50%R, преобразуем в градации серого получаем 42,7% и 23,5% серого соотбетственно

Еще раз повторюсь все это считается исходя из параметров человеческого глаза! и используются эти коэф. 
В теме просят преобразовать в ч/б изображение , я представил один из вариантов его добывания, о чем ты споришь ???? 

Автор: drkot 8.6.2006, 12:04
Цитата(Romikgy @  8.6.2006,  12:00 Найти цитируемый пост)
о чем ты споришь ???? 

о том, что преобразование делается не просто так, а для того чтоб на результат люди смотрели.
наверное особенности глаза надо учитывать. 

Автор: Romikgy 8.6.2006, 12:12
Цитата(iddqd @  8.6.2006,  08:35 Найти цитируемый пост)
В Corel Photo Paint есть такая функция:Image->Color Mode-Black and White (1-bit)->Conversion: Stucki

это спросили. его алгоритм!
Я у автора темы попросил
Цитата(Romikgy @  8.6.2006,  10:05 Найти цитируемый пост)
возьми картинку любую , выложи здесь (только не сильно большую),и сделай вЦитата(iddqd @  8.6.2006,  08:35 )В Corel Photo Paint есть такая функция:Image->Color Mode-Black and White (1-bit)->Conversion: Stuckiи выложи результат, имхо желательно в бмп формате, легче будет разбиратся с алгоритмом

его ответа пока не вижу smile
А всю эту димагогию разводить ...
Цитата(drkot @  8.6.2006,  11:04 Найти цитируемый пост)
чтоб на результат люди смотрели

имхо пускай автор отвечает!
Спорить с тобой
drkot, смысла не вижу! 

Автор: Albinos_x 8.6.2006, 13:59
что-то вроде этого наверно:
Код
...
var c:tcolor;
      r,g,b:byte;
      i,j:Word;
begin
for i:=0 to Image2.Picture.Width do
 for j:=0 to Image2.Picture.Height do
  begin
  c:=Image2.Canvas.Pixels[i,j];
  r:=c mod 256;
  c:=c div 256;   // здесь можно ещё примнять операцию сдвига shr
  g:=c mod 256;
  b:=c div 256;
  c:=(r+g+b) div 3;
  if c<128 then c:=$FFFFFF else c:=$0;
  Image2.Canvas.Pixels[i,j]:=c;
  end;
...

если я правильно понял... 

Автор: Mechanic 9.6.2006, 07:57
Чтоб нормально просчитать цвет, нужны яркостные коэффициенты.
Код

Grey := 0.3 * R + 0.59 * G + 0.11 * B;

А потом уже можно по порогу:
Код

BW := integer(Grey>127);


А вообще, есть для B/W конвертинга масса методов. Есть ещё дитеринг. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)