Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм преобразования монохромного изображения [D7, WinXP]


Страницы:   1 2 3

Штотоносец ©   (2005-03-11 20:28:00) 

Не знаю как точно сказать. Вообщем есть монохромное изображение и надо его преобразовать в 2, 4, 8 и т.д. цветное, т.е. градацией серого. Во. Вроде понятно объяснил :)


Штотоносец   (2005-03-14 18:16:00) [21]

У меня по YurikGL [7] получилось следующее;

procedure Tfrm_Main.GetGrayScale(Value:Integer);
var
 i,w,h:integer;
 a,c:Real;
 b:byte;
begin
 w:=0;
 h:=0;
 if value<>256 then a:=256/value;
 for i:=1 to Length(ArrByteImg) do begin
   b:=ArrByteImg[i-1];
   if value<>256 then begin
     c:=Ceil(b/a);
     if (b-a*c)>(a/2) then c:=Floor(b/(a+1));
     b:=Round(c*a);
     if (b=0) and (c<>0) then dec(b);
   end;
   Image2.Canvas.Pixels[w,h]:=b shl 16 + b shl 8 + b;
   inc(w);
   if w=Image2.Width then begin
     w:=0;
     inc(h);
   end;
 end;
end;


Единственная проблема в то, что при 2-х цветности получаются 128 и 255, т.е. белый и серый, а не черный.
Посмотрите пожалуйста в чем проблема.

Да, вот еще. ArrByteImg это ArrByteImg:array of byte;

 a:=0;
 SetLength(ArrByteImg,Image2.Height*Image2.Width-1);
 for h:=0 to Image2.Height-1 do begin
   for w:=0 to Image2.Width-1 do begin
     ArrByteImg[a]:=GetRValue(Image2.Canvas.Pixels[w,h]);
     inc(a);
   end;
 end;


Fenik   (2005-03-12 20:04:00) [22]

Забыл:
n := Round(256/(Value-1));
можно вынести из цикла :)


Fenik   (2005-03-12 19:38:00) [23]

Ладно уж, даю грубый вариант:


procedureSetGrayScale(Bitmap: TBitmap; Value: Byte);
varPixel: pRGBTriple;
   x, y, n: Integer;
   A: array[Byte] ofByte;
begin
  ifValue > 1 then begin
   A[0] := 0;
   A[255] := 255;
    forx := 1 to254 do begin
      caseValue of
       2: A[x] := Byte(x>127)*255;
       3..127: begin
         n := Round(256/(Value-1));
         n := Round(x/n)*n;
          ifn <= 255 thenA[x] := n
                      elseA[x] := 255;
        end;
        elseA[x] := x;
      end;
    end;
  end
  else
   FillChar(A, SizeOf(A), 0);
   
  fory := 0 toBitmap.Height - 1 do begin
   Pixel := Bitmap.ScanLine[y];
    forx := 0 toBitmap.Width - 1 do begin
      withPixel^ do begin
       rgbtBlue  := A[rgbtBlue];
       rgbtGreen := A[rgbtGreen];
       rgbtRed   := A[rgbtRed];
      end;
     Inc(Pixel);
    end;
  end;
end;


Штотоносец   (2005-03-12 15:13:00) [24]

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


Virgo_Style   (2005-03-12 15:08:00) [25]

Самое дубовое решение - разбить диапазон 0..255 на поддиапазоны в нужном количестве. Например
0..128   - это цвет (0+128)/2
128..255 - это цвет (128+255)/2
Куда попадает твой серый - тем цветом он и станет.
Чуть менее дубовое - считать средний цвет для каждого диапазона.
Но это все равно дубово, а если надо хорошо - тогда [7]


Штотоносец   (2005-03-12 13:19:00) [26]

Допустим есть изображение, у которого каждый Image2.Canvas.Pixels[w,h] равен некоему колору, в момнохроме от 0..255, точнее например RGB(0,0,0), это черный, а RGB(255,255,255), это белый.
Понятно, что если просто уменьшать это значение, то при двухцветности, рисунок станет просто черным, да это будет видно и раньше.

Я понимаю, что YurikGL [7]высказал верную идею, но у меня возникают проблемы с ее реализацией, точнее на проблемы, а я не знаю даже как начать.


Fenik   (2005-03-12 12:05:00) [27]

Ты в баню?
Нет, я в баню.
Ааа, я думал, что ты в баню.


XProger   (2005-03-12 04:31:00) [28]

т.е. бит?
Допустим было изображение 8 бит на киксель урезали стало 7 бит ... 1 бита на пиксель. С потерей качества разумеется.


XProger   (2005-03-12 04:30:00) [29]

Штотоносец, дык тебе уменьшение кол-ва байт на пиксель нужно? ;)


Штотоносец   (2005-03-11 23:52:00) [30]

Так, попробую. В ПАМЯТИ хранится изображение. Монохромное - 256 градаций. В зависимости от положения бегунка, на форму выводится изображение преобразованное с оригинала (в памяти). Поэтому восстановление потерянной информации не подразумевается из-за отсутствие таковой =)


Virgo_Style   (2005-03-11 22:11:00) [31]

TUser ©   (11.03.05 21:50) [13]
Хм. Автор! Объясните народу - информацию надо потерять или найти? Градации серого - в меньшее количество градаций серого, или же B&W - в градации?
:-)


Virgo_Style   (2005-03-11 21:50:00) [32]

Да, я, кажется, неправ :-) Это для Черный+Белый -> градации серого, а вопрос, как я теперь понял, о снижении цветности? Тогда молчу :-)


TUser   (2005-03-11 21:50:00) [33]


> YurikGL ©

я понимаю - тут обратная задачав. воссановить информацию из изображения, где эта инфа потеряна. низя ...


YurikGL   (2005-03-11 21:09:00) [34]


> А чем [1] не устраивает?


есть у тебя картинка, где реально используются цвета
0,1,2,10,11,12,230,231,232,250,251,252.
Нужно к 4-м цветам преобразовать на основании чего будещ диапазоны цветов выбирать?


Штотоносец   (2005-03-11 21:05:00) [35]

Так там, помоему, еще мудреней :)


Virgo_Style   (2005-03-11 21:02:00) [36]


> Да уж, мудрено

Мне тоже так показалось :-) А чем [1] не устраивает?


Штотоносец   (2005-03-11 21:01:00) [37]

Да уж, мудрено. А может у кого завалялся исходничек?


YurikGL   (2005-03-11 20:49:00) [38]

Тебе нужны методы кластеризации.
Кратко, суть в том, что произвольное множество точек делится на заранее заданное (в твоем случае) количество "сгущений". Результатом применения метода будут центры "сгущений". Дальше, вычисляя расстояние между конкретной точкой и центрами "сгущений" заменяем эту точку центром ближайшего "сгущения". Не уверен, что эти методы можно в инете нарыть, на на лабах такие рассчеты мы делали.


Штотоносец   (2005-03-11 20:37:00) [39]

Нет не цветное, а как бы серое 8\ Всмысле если двухцветное, то это черный и белый, если 4, то белый, черный и две градации серого. Всего, максимально, какбы 256 градаций. Изображение-то монохромное, т.е. серое и то, что колор получить никак я понимаю, вообщем это и не надо.


YurikGL   (2005-03-11 20:33:00) [40]


> Штотоносец   (11.03.05 20:28)  

можно поискать как Image-ready гифы делает...


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо