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

Вниз

считывание данных из bmp файла   Найти похожие ветки 

 
simmoril ©   (2003-08-03 14:51) [0]

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


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

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


 
simmoril ©   (2003-08-03 18:28) [2]

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


 
Fenik ©   (2003-08-03 18:51) [3]

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.


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

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


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

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


 
simmoril ©   (2003-08-05 18:43) [6]

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

p := Bitmap.PixelFormat[y];

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


 
Fenik ©   (2003-08-05 20:03) [7]

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

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


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

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

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


 
Fenik ©   (2003-08-06 19:34) [9]

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

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


 
simmoril ©   (2003-08-06 19:37) [10]

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


 
Fenik ©   (2003-08-06 19:44) [11]

> 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 20:38) [12]

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


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

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

xR+yG+zB

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


 
Fenik ©   (2003-08-08 11:23) [14]

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

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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.01 c
3-11588
rtooo
2003-11-13 21:57
2003.12.04
какими базами для этого лучше всего пользоваться


4-11754
otistarda
2003-10-08 16:13
2003.12.04
Консоль


8-11624
9351561
2003-08-02 22:32
2003.12.04
Проигрывание DVD


1-11602
greenrul
2003-11-26 03:31
2003.12.04
Проблемы с File of TMyType


8-11619
popurri
2003-07-11 10:25
2003.12.04
Сам очищается ImageList