|
Вопрос # 6 113/ вопрос открыт / |
|
Здравствуйте! помогите разобраться с Интегральными изображениями.
По сути, интегральное изображение это накопление в каждом пикселе значений о предыдущем пикселе. Каким образом происходит накопление? Мы положим что каждый пиксель (x,y) – имеет значение суммы всех пикселей в окрестности (0,0,x,y). То есть прямоугольника с верхней левой вершиной в начальной точке и правой нижней в рассматриваемой точке. Таким образом получается, что вычислить такой прямоугольник можно всего 4мя обращениями к массиву. Допустим необходимо вычислить значение прямоугольника (x1,y1,x2,y2). Тогда его сумму можно вычислить следующими операциями: I’=I-I1-I2+I3. А так как Сумма каждого прямоугольника лежит в его нижнем правом пикселе, то обращения будут такими:
I’=I(x2,y2)-I1(x2,y1)-I2(x1,y2)+I3(x1,y1);
есть 2 варианта на делфи, не могу разобраться в классе(как его использовать), на C#(помогите переделать под делфи)
исходник класса на Delphi:
uses Graphics,Types;
type
TRGB=record
r,g,b:byte;
end;
trgba=array[0..1024]of trgb;
prgba=^trgba;
//Класс интегрального изображения
TIntegralImage=class(TObject)
private
matrix:array of array of integer;
function Awidth:integer;
function Aheight:integer;
public
procedure Assign(bmp:TBitmap);
function GetRect(r:Trect):integer;
property width:integer read AWidth;
property Height:integer read AHeight;
end;
implementation
{ TIntegralImage }
function TIntegralImage.Aheight: integer;
begin
result:=length(self.matrix[0]);
end;
procedure TIntegralImage.Assign(bmp: TBitmap);
var
i,j,w,h,s:integer;
l:prgba;
begin
//Создаем матрицу соразмерную изображению
bmp.PixelFormat:=pf24bit;
w:=bmp.Width;
h:=bmp.Height;
setlength(matrix,w);
for i:=0 to w-1 do
setlength(matrix[i],h);
//Вычисляем интегральную матрицу
for j:=0 to h-1 do
begin
l:=bmp.ScanLine[j];
for i:=0 to w-1 do
begin
s:=l[i].r;
if i>0 then s:=s+matrix[i-1,j];
if j>0 then s:=s+matrix[i,j-1];
if (i>0)and(j>0)then s:=s-matrix[i-1,j-1];
matrix[i,j]:=s;
end;
end;
end;
function TIntegralImage.Awidth: integer;
begin
result:=length(self.matrix);
end;
function TIntegralImage.GetRect(r: Trect): integer;
begin
result:=matrix[r.Right,r.Bottom];
if r.top>0 then result:=result-matrix[r.Right,r.top-1];
if r.left>0 then result:=result-matrix[r.Left-1,r.bottom];
if (r.left>0)and(r.Top>0)then result:=result+matrix[r.Left-1,r.top-1];
end;
Реализация C# (помогите переделать под делфи)
//вычисление интегрального представления изображения
public static int[,] IntegralImage(int[,] sourceImage)
{
int width = sourceImage.GetLength(0);
int height = sourceImage.GetLength(1);
int[,] result = new int[width, height];
result[0, 0] = sourceImage[0, 0];
for (int x = 1; x < width; x++)
result[x, 0] = sourceImage[x, 0] + result[x - 1, 0];
for (int y = 1; y < height; y++)
result[0, y] = sourceImage[0, y] + result[0, y - 1];
for (int y = 1; y < height; y++)
for (int x = 1; x < width; x++)
result[x, y] = sourceImage[x, y] + result[x - 1, y] + result[x, y - 1] - result[x - 1, y - 1];
return result;
}
//рассчет суммы яркости пикселов в произвольном прямоугольнике
public static int SumOfRectangle(int[,] integralImage, Rectangle rect)
{
int A = 0, B = 0, C = 0, D = 0;
if (rect.Top > 0 || rect.Left > 0)
if (rect.Top <= 0)
D = integralImage[rect.Left - 1, rect.Bottom];
else
if (rect.Left <= 0)
B = integralImage[rect.Right, rect.Top - 1];
else
{
A = integralImage[rect.Left - 1, rect.Top - 1];
B = integralImage[rect.Right, rect.Top - 1];
D = integralImage[rect.Left - 1, rect.Bottom];
}
C = integralImage[rect.Right, rect.Bottom];
return A + C - B - D;
}
 |
Вопрос задал: casio (статус: Посетитель)
Вопрос отправлен: 3 мая 2012, 12:42
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 4 мая 2012, 12:18; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 3 мая 2012, 13:38 [#1]:
Цитата:
есть 2 варианта на делфи
Где 2-й вариант на Delphi?
Где взял 1-й вариант? Кто автор?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
casio (статус: Посетитель), 4 мая 2012, 12:18 [#2]:
min@y™: 2й вариант на С, 1й вариант нашел в сети
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|