![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Алгоритм преобразования монохромного изображения [D7, WinXP]
Штотоносец © (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 гифы делает...