Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

считывание данных из bmp файла


simmoril ©   (2003-08-03 14:51:00) 

Задача состоит в считывании из bmp файла (картинка, вообще говоря, цветная) информации о яркости пикселей. Конкретнее, требуется получить прямоугольную матрицу чисел, каждое из которых будет определять только яркость соответствующего пиксела. Как будто, для чтения bmp файла надо пользоваться TCanvas.pixels[i,j].
Вопрос: как конкретизировать то, что мы хотим получить информацию именно о яркости пикселей?


Fenik   (2003-08-08 11:23:00) [1]

Взял у знакомого книгу "Delpi 5 создание мультимедийных приложений". Так это оттуда:

"... Особенно хорошо воспринимается зелёный свет, красный свет воспринимается несколько хуже, а чувствительность глаза к синему свету ещё ниже. Многочисленные психологические тесты позволяют считать, что яркость вычисляется по формуле:"

L = 0.3*R + 0.59*G + 0.11*B


pasha676_*   (2003-08-07 13:20:00) [2]

Да что то в этом роде. Я брал в каком-то англоязычном журнале.
Вот только Fenic у меня сомнения по факту коэффицентов в твоей формуле и особенно их порядка.
Я конечно могу ошибаться (данной тематикой лет 5-6 уже не занимался).
Fenic не мог бы ты привести формулу вида

xR+yG+zB

Где x,y,z - коэффиценты, ну а RGB - это соответственно цвета.


simmoril   (2003-08-06 20:38:00) [3]

Большое спасибо.


Fenik   (2003-08-06 19:44:00) [4]

> Fenik © (06.08.03 19:34)

Точнее так:
Matrix[y, x] := BLimit(Round((p[x*3]*0.11 + p[x*3+1]*0.59 + p[x*3+2]*0.3)));


simmoril   (2003-08-06 19:37:00) [5]

pasha676, может это p[x*3] + p[x*3+1] + p[x*3+2])/3 и не яркостная составляющая, но в матрице те значения, которые мне нужно.
Не подскажешь, где можно прочитать про неоднозначность цвета, о которой ты говорил (желательно на русском языке)? Меня просто заинтересовала эта тема.


Fenik   (2003-08-06 19:34:00) [6]

Вот верная формула:

Matrix[y, x] := BLimit(Round((p[x*3]*0.11 + p[x*3+1]*0.59 + p[x*3+2]*0.3)/3));


pasha676   (2003-08-06 10:33:00) [7]

p[x*3] + p[x*3+1] + p[x*3+2])/3

ЭЭЭ. Строго говоря это помоему не яркостная составляющая, а как бы средняя мощность по всем цветам. Впрочем может она и была нужна? А если нужна именно яркость - то надо перейти в другое измерение цвета (зашибись написал, но что то башка не думает о правильности терминов), где присутствует яркостная составляющая (см например предложение evSer-а, хотя в HSV я не вникал, но вроде что то около дерева). И помоему таких систем несколько. В jpg алгоритме что то подобное используется, он проще даже (тут опять память подводит).
Т.к. цвет не однозначен: 255 красного по яркости совсем не то что 255 зеленого. У каждого цвета есть еще свои весовые коэффиценты, которые определяют яркость.


Fenik   (2003-08-05 20:03:00) [8]

Ой блин!
Очепятка.

надо так:
p := Bitmap.ScanLine[y];


simmoril   (2003-08-05 18:43:00) [9]

Что происходит в строке

p := Bitmap.PixelFormat[y];

если выводится сообщение об ошибке «Аrray type required.»
Как мне это исправить?


Fenik   (2003-08-03 19:00:00) [10]

Вот и первая ошибочка:
не
for x := 0 to Bitmap.Width do
а
for x := 0 to Bitmap.Width - 1 do


iXuSs   (2003-08-03 18:57:00) [11]

http://www.efg2.com/Lab/Graphics/Colors/HSV.htm


Fenik   (2003-08-03 18:51:00) [12]

function BLimit(A: Integer): Byte;
begin
if A < 0 then Result := 0
else if A > 255 then Result := 255
else Result := A;
end;

...

var
Bitmap: TBitmap;
Matrix: array of array of Byte;
x, y: Integer;
p: pByteArray;

begin
Bitmap := TBitmap.Create;
try
Bitmap.LoadFromFile("file.bmp");
Bitmap.PixelFormat := pf24Bit;
SetLength(Matrix, Bitmap.Height);
for y := 0 to Bitmap.Height - 1 do begin
p := Bitmap.PixelFormat[y];
SetLength(Matrix[y], Bitmap.Width);
for x := 0 to Bitmap.Width do
Matrix[y, x] := BLimit(Round((p[x*3] + p[x*3+1] + p[x*3+2])/3));
end;
finally
Bitmap.Free;
end;
end;

В Matrix то, что нужно.
За ошибки не пинать: писал без Delphi.


simmoril   (2003-08-03 18:28:00) [13]

Большое Спасибо.


esVer   (2003-08-03 16:55:00) [14]

Получить RGB каждого пиксела
Перевести RGB в HSV
V - яркость


Наверх

Титульная страница Поиск, карта сайта Написать письмо