Головна сторінка
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.62 MB
Час: 0.071 c
3-1100517366
Domkrat
2004-11-15 14:16
2004.12.12
Sql


14-1100041467
GanibalLector
2004-11-10 02:04
2004.12.12
Даєш зустріч в Харкові ???


14-1101285539
msguns
2004-11-24 11:38
2004.12.12
Одиночесво?


14-1101106133
озон
2004-11-22 09:48
2004.12.12
Простий растровий редактор


1-1101399547
Саньок
2004-11-25 19:19
2004.12.12
створення програм





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