Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.12;
Скачать: CL | DM;

Вниз

Контраст и Яркость.   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.034 c
3-1100103136
Olga_cc
2004-11-10 19:12
2004.12.12
DBGRID


14-1101363932
NewDelpher
2004-11-25 09:25
2004.12.12
Вопрос ученым: Нужен ли диссертант научному руководителю?


3-1100446917
kein
2004-11-14 18:41
2004.12.12
копирование из базы в базу


6-1096646370
квакер
2004-10-01 19:59
2004.12.12
POP3 Using


3-1100117875
VitGun
2004-11-10 23:17
2004.12.12
Можно ли использовать один гереатор для двух триггеров?