Головна сторінка
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 = упакований запис
  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.88 MB
Час: 0.113 c
8-1094227655
Artin
2004-09-03 20:07
2004.12.12
Відтворення фільму з довільного місця DSPack.


1-1101743824
NSerge
2004-11-29 18:57
2004.12.12
Збереження в кодуванні DOS (866)


14-1100855778
WondeRu
2004-11-19 12:16
2004.12.12
Відкуп від армії VS. Аспірантура


1-1101548789
Серхіо
2004-11-27 12:46
2004.12.12
що потрібно здолати що б не було таких повідомлень


3-1100507408
Термін
2004-11-15 11:30
2004.12.12
Питання щодо використання збережених процедур





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в&#39;єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська