Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: casio (статус: Посетитель)
Вопрос отправлен: 3 мая 2012, 12:42
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 4 мая 2012, 12:18; участников в обсуждении: 2.
min@y™

min@y™ (статус: Доктор наук), 3 мая 2012, 13:38 [#1]:

Цитата:


есть 2 варианта на делфи

Где 2-й вариант на Delphi?
Где взял 1-й вариант? Кто автор?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
casio

casio (статус: Посетитель), 4 мая 2012, 12:18 [#2]:

min@y™: 2й вариант на С, 1й вариант нашел в сети

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.02 сек.