![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Контраст и Яркость. [D5, Win95/98, Win2k]
debuger © (2004-09-10 17:45:00)Доброго всем всего.
У меня есть grayScale Image 2000*2000. Нужно изменять у этой имаги brightness и contrast (не одновременно канешна же). Как бы все просто. Но это нужно делать ну очень быстро, т.е. выглядеть должно так:
- смотрю я на имагу, кручу калесо мыши и, о чудо, меняется контраст(например). И меняеться довольно быстро(~200ms).
Проходить попиксельно слишком долго, пробовал менять палитру, но она дурная.
Пасиб.
Рыба (2004-09-17 20:51:00) [1]>Mihey_temporary © (16.09.04 22:20) [14]
А теперь переведи это на Delphi. ;-)
Mihey_temporary (2004-09-16 22:20:00) [2]Сел писать программку, выполняющую данную задачу, но решил копнуть инфы. И посмотрите, что нашёл:
http://www.efg2.com/Lab/ImageProcessing/ImageEnhancementUsingPalettes.htm
В точности то, что нужно!
wholenado (2004-09-16 01:24:00) [3]гы, родной а ты картинку смасштабируй до маленького размерчика типа в окошечке 256*256 и в интерактиве изгаляйся над ней - ошнь быстро будт все....а как лостигнешь результата - применяй на большой оригинал.....
Mihey_temporary (2004-09-15 21:36:00) [4]
> Рыба © (15.09.04 19:30) [11]
Проверил на быстродействие на практике - вроде нет разницы. Значит лучше дейстивтельно packed.
Рыба (2004-09-15 19:30:00) [5]>Mihey_temporary © (12.09.04 22:09) [9]
Кто-то мне советовал. И учусь у первоисточника: в модуле Windows -
tagRGBTRIPLE = packedrecord
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;
TRGBTriple = tagRGBTRIPLE;
Там вообще все записи идут с этим словом.
Хотя в справку сейчас глянул - написано мол упаковка замедляет доступ к данным. Надо бы у мастеров спросить.
debuger (2004-09-13 19:32:00) [6]Господа, меня немного небыло, но вы не потерялись.
Метод со сканлайном не катит, т.к. он не дает риалтаймности, т.е. он слишком долгий.
Нужно тягать палитру, но она дурная в следующем смысле.
Когда я делаю свою палитру, винды для отображения моего рисунка пользуються функцием ГетНиарест, которая находит соответствие нашему цвету цвет в палитре (судя по-всему по евклидовому расстоянию). А это не то что нужно. Тогда если я сделаю палитру из 20 цветов, то из изображения получу ацтой(простите за выражение).
Пасиба всем.
ПС: Здаеться эта проблема решилась ДиректИксовыми функциями, и довольно легко.
Mihey_temporary (2004-09-12 22:09:00) [7]
> 1. Нужно про-scnaline'ить битмап только по одной компаненте
> (т.к. GrayScale).
> 2. Сделать это только один раз. А дальше работаем с палитрой,
> учитывая найденный коэффициент, и будет - смотрю я на имагу,
> кручу калесо мыши и, о чудо, меняется контраст(например).
Угу, так и есть.
Ещё. В посте 3 ты сказал:
Лучше
TRGB = packed record
B, G, R: Byte;
end;
Почему лучше?
Рыба (2004-09-12 19:03:00) [8]>Mihey_temporary © (12.09.04 00:04) [6]
>Ещё есть такая проблемка...
Я вот подумал, разве это проблема?
1. Нужно про-scnaline'ить битмап только по одной компаненте (т.к. GrayScale).
2. Сделать это только один раз. А дальше работаем с палитрой, учитывая найденный коэффициент, и будет - смотрю я на имагу, кручу калесо мыши и, о чудо, меняется контраст(например).
Рыба (2004-09-12 17:04:00) [9]>Mihey_temporary © (12.09.04 00:04) [6]
X-Disa привел оба варианта контраста в первой процедуре.
Mihey_temporary (2004-09-12 00:04:00) [10]Ещё есть такая проблемка. Контраст бывает разных видов. Можно сделать контраст по-простому, обладая только данным о конкретном пикселе, а можно добиться лучшего качества, но для этого надо просчтитать среднее значение интенсивности для трёх каналов, т.е. разок, но всё же придётся про-scnaline'ить битмап.
Рыба (2004-09-11 21:12:00) [11]>Mihey_temporary © (11.09.04 20:09) [4]
Это верно. Тем более вариант X-Disa никак не будет выполняться со скоростью 200мс для растра 2000х2000.
Так что Bitmap.PixelForat := pf8Bit; и работать с палитрой.
>debuger © (10.09.04 17:45)
>пробовал менять палитру, но она дурная.
Что значит "дурная"?.
Mihey_temporary (2004-09-11 20:09:00) [12]ещё лучше - MBo © (10.09.04 18:01) [1]
Рыба (2004-09-11 19:50:00) [13]>X-Disa (11.09.04 08:05) [2]
>type TRGB = record
Лучше
TRGB = packedrecord
B, G, R: Byte;
end;
И как в предыдущей функции вместо вот этого
> with Line^ do begin
> try
> R :=inttobyte(R+Red);
> G :=inttobyte(G+Green);
> B :=inttobyte(B+Blue);
> except end;
> end;
Вот это:
with Line^ do begin
B := BLimit(B+Blue);
G := BLimit(G+Green);
R := BLimit(R+Red);
end;
X-Disa (2004-09-11 08:05:00) [14]Контраст:
procedure Contrast(Bitmap: TBitmap; Value: Integer; Local: Boolean;);
function BLimit(B: Integer): Byte;
begin
if B < 0 then Result := 0
else if B > 255 then Result := 255
else Result := B;
end;
var Dest: pRGBTriple;
x, y, mr, mg, mb,
W, H, tr, tg, tb: Integer;
vd: Double;
P:TPixelFormat;
begin
Bitmap.PixelFormat := pf24Bit;
if Value = 0 then Exit;
W := Bitmap.Width - 1;
H := Bitmap.Height - 1;
if Local then begin
mR := 128;
mG := 128;
mB := 128;
end
else begin
tr := 0;
tg := 0;
tb := 0;
for y := 0 to H do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to W do begin
with Dest^ do begin
Inc(tb, rgbtBlue);
Inc(tg, rgbtGreen);
Inc(tr, rgbtRed);
end;
Inc(Dest);
end;
mB := Trunc(tb / (W * H));
mG := Trunc(tg / (W * H));
mR := Trunc(tr / (W * H));
end;
end;
if Value > 0 then vd := 1 + (Value / 10)
else vd := 1 - (Sqrt(-Value) / 10);
for y := 0 to H do begin
Dest := Bitmap.ScanLine[y];
for x := 0 to W do begin
with Dest^ do begin
rgbtBlue := BLimit(mB + Trunc((rgbtBlue - mB) * vd));
rgbtGreen := BLimit(mG + Trunc((rgbtGreen - mG) * vd));
rgbtRed := BLimit(mR + Trunc((rgbtRed - mR) * vd));
end;
Inc(Dest);
end;
end;
end;
Яркость:
Переменные Red, Green, и blue вводить одинаковые. Либо больше либо меньше нуля.
Procedure SetupChannels(Bitmap: TBitmap;Red,Green,Blue:integer);
type TRGB = record
B, G, R: Byte;
end;
FRGB = ^TRGB;
var x, y: Integer;
Line: FRGB;
P:TPixelFormat;
begin
bitmap.PixelFormat:=pf24bit;
for y := 0 to Bitmap.Height - 1 do begin
Line := Bitmap.ScanLine[y];
for x := 0 to Bitmap.Width - 1 do begin
with Line^ do begin
try
R :=inttobyte(R+Red);
G :=inttobyte(G+Green);
B :=inttobyte(B+Blue);
except end;
end;
Inc(Line);
end;
end;
end;
MBo (2004-09-10 18:01:00) [15]для GrayScale - как раз палитрой оперировать быстрее всего будет