Форум: "Media";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизКонтраст и Яркость. Найти похожие ветки
← →
debuger © (2004-09-10 17:45) [0]Доброго всем всего.
У меня есть grayScale Image 2000*2000. Нужно изменять у этой имаги brightness и contrast (не одновременно канешна же). Как бы все просто. Но это нужно делать ну очень быстро, т.е. выглядеть должно так:
- смотрю я на имагу, кручу калесо мыши и, о чудо, меняется контраст(например). И меняеться довольно быстро(~200ms).
Проходить попиксельно слишком долго, пробовал менять палитру, но она дурная.
Пасиб.
← →
MBo © (2004-09-10 18:01) [1]для GrayScale - как раз палитрой оперировать быстрее всего будет
← →
X-Disa (2004-09-11 08:05) [2]Контраст:
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;
← →
Рыба © (2004-09-11 19:50) [3]>X-Disa (11.09.04 08:05) [2]
>type TRGB = record
Лучше
TRGB = packed record
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;
← →
Mihey_temporary © (2004-09-11 20:09) [4]ещё лучше - MBo © (10.09.04 18:01) [1]
← →
Рыба © (2004-09-11 21:12) [5]>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-12 00:04) [6]Ещё есть такая проблемка. Контраст бывает разных видов. Можно сделать контраст по-простому, обладая только данным о конкретном пикселе, а можно добиться лучшего качества, но для этого надо просчтитать среднее значение интенсивности для трёх каналов, т.е. разок, но всё же придётся про-scnaline"ить битмап.
← →
Рыба © (2004-09-12 17:04) [7]>Mihey_temporary © (12.09.04 00:04) [6]
X-Disa привел оба варианта контраста в первой процедуре.
← →
Рыба © (2004-09-12 19:03) [8]>Mihey_temporary © (12.09.04 00:04) [6]
>Ещё есть такая проблемка...
Я вот подумал, разве это проблема?
1. Нужно про-scnaline"ить битмап только по одной компаненте (т.к. GrayScale).
2. Сделать это только один раз. А дальше работаем с палитрой, учитывая найденный коэффициент, и будет - смотрю я на имагу, кручу калесо мыши и, о чудо, меняется контраст(например).
← →
Mihey_temporary © (2004-09-12 22:09) [9]
> 1. Нужно про-scnaline"ить битмап только по одной компаненте
> (т.к. GrayScale).
> 2. Сделать это только один раз. А дальше работаем с палитрой,
> учитывая найденный коэффициент, и будет - смотрю я на имагу,
> кручу калесо мыши и, о чудо, меняется контраст(например).
Угу, так и есть.
Ещё. В посте 3 ты сказал:
Лучше
TRGB = packed record
B, G, R: Byte;
end;
Почему лучше?
← →
debuger © (2004-09-13 19:32) [10]Господа, меня немного небыло, но вы не потерялись.
Метод со сканлайном не катит, т.к. он не дает риалтаймности, т.е. он слишком долгий.
Нужно тягать палитру, но она дурная в следующем смысле.
Когда я делаю свою палитру, винды для отображения моего рисунка пользуються функцием ГетНиарест, которая находит соответствие нашему цвету цвет в палитре (судя по-всему по евклидовому расстоянию). А это не то что нужно. Тогда если я сделаю палитру из 20 цветов, то из изображения получу ацтой(простите за выражение).
Пасиба всем.
ПС: Здаеться эта проблема решилась ДиректИксовыми функциями, и довольно легко.
← →
Рыба © (2004-09-15 19:30) [11]>Mihey_temporary © (12.09.04 22:09) [9]
Кто-то мне советовал. И учусь у первоисточника: в модуле Windows -tagRGBTRIPLE = packed record
rgbtBlue: Byte;
rgbtGreen: Byte;
rgbtRed: Byte;
end;
TRGBTriple = tagRGBTRIPLE;
Там вообще все записи идут с этим словом.
Хотя в справку сейчас глянул - написано мол упаковка замедляет доступ к данным. Надо бы у мастеров спросить.
← →
Mihey_temporary © (2004-09-15 21:36) [12]
> Рыба © (15.09.04 19:30) [11]
Проверил на быстродействие на практике - вроде нет разницы. Значит лучше дейстивтельно packed.
← →
wholenado © (2004-09-16 01:24) [13]гы, родной а ты картинку смасштабируй до маленького размерчика типа в окошечке 256*256 и в интерактиве изгаляйся над ней - ошнь быстро будт все....а как лостигнешь результата - применяй на большой оригинал.....
← →
Mihey_temporary © (2004-09-16 22:20) [14]Сел писать программку, выполняющую данную задачу, но решил копнуть инфы. И посмотрите, что нашёл:
http://www.efg2.com/Lab/ImageProcessing/ImageEnhancementUsingPalettes.htm
В точности то, что нужно!
← →
Рыба © (2004-09-17 20:51) [15]>Mihey_temporary © (16.09.04 22:20) [14]
А теперь переведи это на Delphi. ;-)
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.146 c