Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.037 c
3-1100182284
Katrin
2004-11-11 17:11
2004.12.12
Как узнать ID созданной с помощью SQL записи?


14-1100856691
парамоша
2004-11-19 12:31
2004.12.12
Сало в шоколаде: миф или реальность?


1-1101551535
Артем Владимирович
2004-11-27 13:32
2004.12.12
Как стереть самого себя


3-1100244981
lightix
2004-11-12 10:36
2004.12.12
Сжать DBF


1-1100705690
Sicilla
2004-11-17 18:34
2004.12.12
Ошибка в delphi 7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский