![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
считывание данных из 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 - яркость