Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Warp mapping 
:(
    Опции темы
cs137
Дата 15.1.2008, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



Здраствуйте!

Нужен алгоритм наложения картинки на карту смещений.

Имеется произвольная картинка:
user posted image

Для нее создается карта смещений. Это сетка с определнным шагом, например 10, где каждый узел сетки задает смещение по двум координатам X и Y. В прямоугольном виде каждый из узлов имеет нулевые смещения по обоим координатам.
user posted image

Узел можно представить в виде структуры типа Point, где X и Y определяют велечину смещения отностительно положения узла в прямоугольной сетке.

Далее мы произвольно деформируем карту смещений, т.е. у каких-то узлов появляются смещения относительно их положения в прямоугольно сетке.
user posted image

После на эту катру накладывается картинка и исходя из значений смещений узлов девормируется.
user posted image

Вот так у меня представляется работа с узлами:

Код

struct offset
{
    float x;
    float y;
};

int img_width = 500; //ширина картинки
int img_height = 500; // высота картинки

int nx = (int)(img_width / 10); // количество узлов по X
int ny = (int)(img_height / 10); // количество узлов по Y

offset ofs[nx][ny]; // массив узлов

/* определение положения узла на картинке без учета смещений (прямоугольная сетка) */
//ix, iy - индексы узла

int X = ix * 10;
int Y = iy * 10;

/* определение положения узла на картинке с учетом его смещений */
//ix, iy - индексы узла
int X = ix * 10 + ofs[ix][iy].x;
int Y = iy * 10 + ofs[ix][iy].y;



Ну и вопрос... Как теперь можно наложить картинку на такую карту деформаций чтобы она таким же образом исказилась? Можно даже с какой-нить простейшим сглаживанием...

Заранее спасибо всем!

PM MAIL   Вверх
maxim1000
Дата 15.1.2008, 13:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



можно попробовать локальные аффинные преобразования (не думаю, что термин общепринятый - придумал только что smile )

1. делим картинку на треугольники (можно просто взять вышеописанную прямоугольную сетку и каждую ячейку разделить на два треугольника)
2. искажаем каждый треугольник (т.е. его вершины как-то двигаем)
3. накладываем картинку, исходя из предположения, что внутри треугольника искажения были аффинные

детали:
аффинное преобразование - умножение на матрицу и сдвиг: y=Ax+b
оно задаётся 6-ю коэффициентами (4 для матрицы и 2 для вектора сдвига)
их мы подбираем так, чтобы точки исходного треугольника переходили в точки сдвинутого
т.к. у треугольника 3 точки, то получаем 6 линейных уравнений, которые, по идее, должны решаться и выдавать единственный набор коэффициентов для преобразования (хотя тут ещё нужно будет поисследовать, когда система будет вырождена, на всякий случай)
именно поэтому нужно делить на треугольники - для прямоугольника целиком в общем случае подходящего аффиного преобразования может и не быть

ну а потом, для каждой точки результирующего изображения можно узнать треугольник, к которому она относится, а потом применить соответствующее обратное преобразование и получить точку исходного изображения


--------------------
qqq
PM WWW   Вверх
cs137
Дата 15.1.2008, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



Спасибо большое! Это очень интерестный вариант. Но мне кажется, что такое наложение картинки может занять долгое время.
Есть вриант простого преобразования: u,v -> x,y. Т.е. проходим по каждому пикселю деформированного прямоугольничка и вычисляем цвет пикселя (x,y) в соответствии с его же положением без смещений (u,v). Смещения всех вершин нам известны.

Вот нашел обратное преобразование:

user posted image -> user posted image

Код

Variable Declarations
 FIXEDPOINT VLDx, VRDx, HDx
 FIXEDPOINT VLDy, VRDy, HDy
 FIXEDPOINT TX1, TY1, TX2, TY2, tx, ty
 INTEGER x, y

Code Begins
 VLDx = (Cx - Ax) / 16          'Rate of change of X down the left side of the wonky square 
 VRDx = (Dx - Bx) / 16          'Rate of change of X down the right side
 VLDy = (Cy - Ay) / 16          'Rate of change of Y down the left side
 VRDy = (Dy - By) / 16          'Rate of change of Y down the right side

 TX1  = Ax
 TY1  = Ay
 TX2  = Bx
 TY2  = By

 loop y from 0 to 15
        HDx  = (TX2-TX1) / 16   'Rate of change of X across the wonky polygon
        HDy  = (TY2-TY1) / 16   'Rate of change of Y across the wonky polygon
        tx = TX1
        ty = TY1

        loop x from 0 to 15
                Image2(x, y) = Image1( int(tx), int(ty) ) 
                tx = tx + HDx
                ty = ty + HDy
        end of x loop

        TX1 = TX1 + VLDx;
        TY1 = TY1 + VLDy;
        TX2 = TX2 + VRDx;
        TY2 = TY2 + VRDy;
 end of y loop


Только не могу в него врубиться :( И получить обратное преобразование, т.е. из прямого в деформированное. И оно к сожалению без сглаживания...
PM MAIL   Вверх
maxim1000
Дата 15.1.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(cs137 @  15.1.2008,  13:53 Найти цитируемый пост)
Спасибо большое! Это очень интерестный вариант. Но мне кажется, что такое наложение картинки может занять долгое время.

ну как сказать...
на каждый пиксель 4 умножения и 4 сложения (если не ошибся в расчётах)
не так уж и много
кроме того, вариант с аффинными преобразованиями позволяет сглаживание:
результат линейно зависит от коэффициентов преобразования, так что можно их сгладить
т.е., например. построить 6 двумерных массивов и пройтись по каждому сглаживающим фильтром


--------------------
qqq
PM WWW   Вверх
Earnest
Дата 16.1.2008, 18:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Вычисляй координаты с плавающей точкой, а дальше используй интерполяцию.

maxim1000 предложил нормальный вариант: афинное преобразование - одно из самых простых (и быстрых). С интерполяцией, конечно, будет дольше.

Термин "локальное афинное преобразование" есть...

Добавлено через 8 минут и 38 секунд
Можно еще использовать билинейное преобразование, поскольку оно определяется 4 точками.
       u = A0 * x + A1 * y + A2 * x * y + A3;
       v = A4 * x + A5 * y + A6 * x * y + A7;
Фактически, оно эквивалентно выполнению афинных преобразований для соответствующих треугольников.
Естественно, все преобразования (для ячеек) нужно посчитать заранее и естественно обратные.
Дальше, поскольку растр обычно обрабатывается по строкам, перед обработкой каждой строки нового растра вычисляем ее разбиение искаженными 4-угольниками (точки разбиения). Все должно работать вполне быстро.


--------------------
...
PM   Вверх
cs137
Дата 17.1.2008, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



maxim1000
Earnest

Спасибо вам большое smile Видимо я поторопился с выводами на счет аффинных преобразований smile В действительности все так и делается:
http://michus.narod.ru/articles/img_warp/index.html
http://www.kgraph.narod.ru/lectures/16_4.htm

Это сообщение отредактировал(а) cs137 - 17.1.2008, 08:45
PM MAIL   Вверх
cs137
Дата 18.1.2008, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



У меня еще пара вопрсов smile

1. При использовании разбиения на треугольники на некоторых границах возникают пробелы.

user posted image

На приведенной картинке видно эти артефакты в областях искажения. С начало я во всех циклах использовал только целые числа. При таком подходе возникали горизонтальные искажения. Не пробелы, а именно искажения, т.е. рисовались не те цвета. Когда же я заменил все циклы на вещественные, то получил разрывы текстур на некоторых границах. В чем может быть загвоздка?
Вообще пишут, что "При реализации алгоритма удобно рассчитывать границы по какому-либо алгоритму растеризации отрезка". Если это может исправить данную ситуацию, то можно пример, пожалуйста smile

2. Можно по подробнее о сглаживании smile Просто при больших искажениях получается достаточно видимый алиасинг (идет большая пикселизация).

Вот код, который я накатал (заранее извиняюсь smile):
Код

/*
* OffsetMesh - класс вершин, имеет методы GetNvY() - количество вершин по Y, GetNvX() - количество вершин по X,
*                      GetVretex(i, j, vex) - возвращает вершину по ее индексам в массиве.
*/
void DistortPictureWithTriangle(IN OffsetMesh* Mesh, IN Gdiplus::Bitmap* Texture, OUT Gdiplus::Bitmap* Picture)
{
    #define GRID_SIZE 9 // постоянная сетки
        int i1, j1, i2, j2;

    PointF vx1, vx2, vx3; // вершины треугольника, которые содержат относительные смещения (относительно прямоугольной сетки)
    PointF p12, p22, p32; //
    PointF p11, p21, p31;

    Graphics grph(Picture);
    grph.Clear(Color(100, 100, 100));

    
    // for each vertex in mesh (для каждой вершины из массива)
    for (int j = 0; j < Mesh->GetNvY() - 1; j++)
    {
        for (int i = 0; i < Mesh->GetNvX() - 1; i++)
        {
            /************************************************************************/
            /* Triangle 1
            /*
            /*    p2 *---* p3
            /*       |  /
            /*       | /
            /*       |/
            /*       * p1
            /*
            /************************************************************************/
            
            // извлекаем вершины треугольника из массива
            Mesh->GetVretex(i, j + 1, &vx1);
            Mesh->GetVretex(i, j, &vx2);
            Mesh->GetVretex(i + 1, j, &vx3);

            // вычисляем реальное расположение вершин на картинке (т.к. величина ячейки сетки константа, то это сделать легко)
            i1 = i * GRID_SIZE;
            i2 = (i + 1) * GRID_SIZE;

            j1 = j * GRID_SIZE;
            j2 = (j + 1) * GRID_SIZE;

            // undeformed points
            p11.X = (REAL)i1;
            p11.Y = (REAL)j2;
            p21.X = (REAL)i1;
            p21.Y = (REAL)j1;
            p31.X = (REAL)i2;
            p31.Y = (REAL)j1;

            // deformed points
            p12.X = (REAL)(i1 + vx1.x);
            p12.Y = (REAL)(j2 + vx1.y);
            p22.X = (REAL)(i1 + vx2.x);
            p22.Y = (REAL)(j1 + vx2.y);
            p32.X = (REAL)(i2 + vx3.x);
            p32.Y = (REAL)(j1 + vx3.y);

            DrawTriangle(p11, p21, p31, p12, p22, p32);

            /************************************************************************/
            /* Triangle 2
            /*
            /*           * p2
            /*          /|
            /*         / |
            /*        /  |
            /*    p1 *---* p3
            /*
            /************************************************************************/

            // извлекаем вершины треугольника из массива
            m_Mesh->GetVretex(i, j + 1, &vx1);
            m_Mesh->GetVretex(i + 1, j, &vx2);
            m_Mesh->GetVretex(i + 1, j + 1, &vx3);

            i1 = i * GRID_SIZE;
            i2 = (i + 1) * GRID_SIZE;

            j1 = j * GRID_SIZE;
            j2 = (j + 1) * GRID_SIZE;

            // undeformed points
            p11.X = (REAL)i1;
            p11.Y = (REAL)j2;
            p21.X = (REAL)i2;
            p21.Y = (REAL)j1;
            p31.X = (REAL)i2;
            p31.Y = (REAL)j2;

            // deformed points
            p12.X = (REAL)(i1 + vx1.x);
            p12.Y = (REAL)(j2 + vx1.y);
            p22.X = (REAL)(i2 + vx2.x);
            p22.Y = (REAL)(j1 + vx2.y);
            p32.X = (REAL)(i2 + vx3.x);
            p32.Y = (REAL)(j2 + vx3.y);

            DrawTriangle(p11, p21, p31, p12, p22, p32);
        }
    }
}

void DrawTriangle(Gdiplus::Bitmap* Texture, Gdiplus::Bitmap* Picture, PointF p11, PointF p21, PointF p31, PointF p12, PointF p22, PointF p32)
{
    REAL b11, b12;
    REAL b21, b22;
    REAL a11, a12;
    REAL a21, a22;
    REAL x1, y1, x2, y2, x2min, x2max;
    REAL Det, UnDet;

    PointF *p2min, *p2mid, *p2max;
    int width, height;

    Gdiplus::Color pix;

    // save picture size
    width = Texture->GetWidth();
    height = Texture->GetHeight();

    // coefficients (x2,y2 -> u,v)
    b11 = p22.X - p12.X;
    b12 = p32.X - p12.X;
    b21 = p22.Y - p12.Y;
    b22 = p32.Y - p12.Y;

    // coefficients (u,v -> x1,y1)
    a11 = p21.X - p11.X;
    a12 = p31.X - p11.X;
    a21 = p21.Y - p11.Y;
    a22 = p31.Y - p11.Y;

    // Det
    Det = b11 * b22 - b12 * b21;
    UnDet = 1 /Det;

    // calculate scan bounds

    p2min = p12.Y <= p22.Y ? (p12.Y <= p32.Y ? &p12 : &p32) : (p22.Y <= p32.Y ? &p22 : &p32);
    p2max = p12.Y > p22.Y ? (p12.Y > p32.Y ? &p12 : &p32) : (p22.Y > p32.Y ? &p22 : &p32);

    if ((p2max != &p12) && (p2min != &p12)) p2mid = &p12;
    if ((p2max != &p22) && (p2min != &p22)) p2mid = &p22;
    if ((p2max != &p32) && (p2min != &p32)) p2mid = &p32;

    if (p2min->Y != p2mid->Y)
        for (y2 = p2min->Y; y2 <= p2mid->Y; y2++)
        {
            x2min = (p2min->X + (p2mid->X - p2min->X) / (p2mid->Y - p2min->Y) * (y2 - p2min->Y));
            x2max = (p2min->X + (p2max->X - p2min->X) / (p2max->Y - p2min->Y) * (y2 - p2min->Y));

            if (x2min > x2max)
            {
                for (x2 = x2min; x2 >= x2max; x2--)
                {
                    x1 = UnDet * ((a11 * b22 - a12 * b21) * (x2 - p12.X) + (a12 * b11 - a11 * b12) * (y2 - p12.Y)) + p11.X;
                    y1 = UnDet * ((a21 * b22 - a22 * b21) * (x2 - p12.X) + (a22 * b11 - a21 * b12) * (y2 - p12.Y)) + p11.Y;
                    
                    // bounds checking
                    if (x1 < 0 || x1 > width || y1 < 0 || y1 > height ||
                        x2 < 0 || x2 > width || y2 < 0 || y2 > height) continue;

                    Texture->GetPixel((int)(x1), (int)(y1), &pix);
                    Picture->SetPixel((int)(x2), (int)(y2), pix);
                }
            }
            else
            {
                for (x2 = x2min; x2 <= x2max; x2++)
                {
                    x1 = UnDet * ((a11 * b22 - a12 * b21) * (x2 - p12.X) + (a12 * b11 - a11 * b12) * (y2 - p12.Y)) + p11.X;
                    y1 = UnDet * ((a21 * b22 - a22 * b21) * (x2 - p12.X) + (a22 * b11 - a21 * b12) * (y2 - p12.Y)) + p11.Y;
                    
                    // bounds checking
                    if (x1 < 0 || x1 > width || y1 < 0 || y1 > height ||
                        x2 < 0 || x2 > width || y2 < 0 || y2 > height) continue;

                    Texture->GetPixel((int)(x1), (int)(y1), &pix);
                    Picture>SetPixel((int)(x2), (int)(y2), pix);
                }
            }
        }

        if (p2max->Y != p2mid->Y)
            for (y2 = p2mid->Y; y2 <= p2max->Y; y2++)
            {
                x2min = (p2mid->X + (p2max->X - p2mid->X) / (p2max->Y - p2mid->Y) * (y2 - p2mid->Y));
                x2max = (p2min->X + (p2max->X - p2min->X) / (p2max->Y - p2min->Y) * (y2 - p2min->Y));

                if (x2min > x2max)
                {
                    for (x2 = x2min; x2 >= x2max; x2--)
                    {
                        x1 = UnDet * ((a11 * b22 - a12 * b21) * (x2 - p12.X) + (a12 * b11 - a11 * b12) * (y2 - p12.Y)) + p11.X;
                        y1 = UnDet * ((a21 * b22 - a22 * b21) * (x2 - p12.X) + (a22 * b11 - a21 * b12) * (y2 - p12.Y)) + p11.Y;

                        // bounds checking
                        if (x1 < 0 || x1 > width || y1 < 0 || y1 > height ||
                            x2 < 0 || x2 > width || y2 < 0 || y2 > height) continue;

                        Texture->GetPixel((int)(x1), (int)(y1), &pix);
                        Picture->SetPixel((int)(x2), (int)(y2), pix);
                    }
                }
                else
                {
                    for (x2 = x2min; x2 <= x2max; x2++)
                    {
                        x1 = UnDet * ((a11 * b22 - a12 * b21) * (x2 - p12.X) + (a12 * b11 - a11 * b12) * (y2 - p12.Y)) + p11.X;
                        y1 = UnDet * ((a21 * b22 - a22 * b21) * (x2 - p12.X) + (a22 * b11 - a21 * b12) * (y2 - p12.Y)) + p11.Y;

                        // bounds checking
                        if (x1 < 0 || x1 > width || y1 < 0 || y1 > height ||
                            x2 < 0 || x2 > width || y2 < 0 || y2 > height) continue;

                        Texture->GetPixel((int)(x1), (int)(y1), &pix);
                        Picture->SetPixel((int)(x2), (int)(y2), pix);
                    }
                }
            }
}

PM MAIL   Вверх
maxim1000
Дата 18.1.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ой... в коде разбираться как-то неинтересно
один вопрос:
цикл по точкам исходного изображения или результирующего?

Добавлено через 4 минуты и 34 секунды
короче, есть два способа:
1. для каждой точки на исходном изображении определить, куда она передвинется, и нарисовать её там
2. для каждой точки результирующего изображения определить, из какой точки исходного она появилась, и нарисовать соответствующий цвет
из-за округления координат до целых эти два метода отличаются
первый приведёт к тому, что все точки исходного изображения будут нарисованы (хотя, возможно, какие-то будут поверх других)
второй - что все точки результирующего будут заполнены
ИМХО, второй логичнее
хотя определение, какому треугольнику принадлежит точка, становится сложнее


--------------------
qqq
PM WWW   Вверх
cs137
Дата 19.1.2008, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



Внешний цикл идет по узлам сетки... берется 4 точки (сначала 3 для первого треугольника, потом 3 для второго). При отрисовке треугольников цикл идет по точкам полученного изображения, в котором определяются точки исходного изображения (2-ой способ). Проблему с разрывом изображения вроде бы удалось решить... в циклах по x2 округляю нижнюю и верхнюю границу, причем нижнюю до меньшего значения, а верхнюю до большего... Теперь только иногда некоторые пиксели проваливаются, т.е. точечный разрыв, но думаю, что это-то сглаживанием можно устранить... не поможете с вариантами на эту тему? Заранее огромное спасибо!!!
PM MAIL   Вверх
Sardar
Дата 20.1.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 1
Всего: 317



Координаты в реальных числах лучше не округлять, а взять все пикселы частями, к примеру:
Код

.....
//получили вещественные (x, y)
//в примере числа с плавающей точкой, но тут лучше (быстрей) с фиксированной (целые)
int dx = x - (int)x;
int dy = y - (int)y;

//floor - округление в меньшую, ceil - в большую сторону
//следующее надо выполнять для каждого канала (цвета)
int px1 = (1-dx)*(1-dy)*getPixel(floor(x), floor(y));
int px2 = (1-dx)*(dy)*getPixel(floor(x), ceil(y));
int px3 = (dx)*(1-dy)*getPixel(ceil(x), floor(y));
int px4 = (dx)*(dy)*getPixel(ceil(x), ceil(y));

//собираем в единое
int px = px1 + px2 + px3 + px4;

Конечно это совсем не быстро, но без швов.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
cs137
Дата 20.1.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



Sardar, большое спасибо за такое решение...
Ориентируясь на Ваш пример, я сделал так:

Код

// берем цвета пикселей из исходного изображения
Color px1, px2, px3, px4;
Texture.GetPixel(floor(x1), floor(y1), &px1);
Texture.GetPixel(floor(x1), ceil(y1), &px2);
Texture.GetPixel(ceil(x1), floor(y1), &px3);
Texture.GetPixel(ceil(x1), ceil(y1), &px4);

// устанавливаем цвета пикселей в получаемом
Picture.SetPixel(floor(x2), floor(y2), px1);
Picture.SetPixel(floor(x2), ceil(y2), px2);
Picture.SetPixel(ceil(x2), floor(y2), px3);
Picture.SetPixel(ceil(x2), ceil(y2), px4);


и все разрывы исчезли smile Хватило и этого smile Еще раз спасибо!


Теперь вопрос по поводу сглаживания... Хотелось бы узнать какой фильтр можно уту применить по сочетанию скорость/качество (если можно с примером)...
У меня при достаточно больших деформациях сетки получаются вот так:

user posted image

Заранее спасибо!

Это сообщение отредактировал(а) cs137 - 20.1.2008, 13:39
PM MAIL   Вверх
maxim1000
Дата 20.1.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



мне кажется, всё-таки стоило бы попробовать сглаживание самих параметров:
делаем двумерный массив, каждый элемент которого - вектор из 6 элементов (параметров аффинного преобразования)
и сглаживаем его - заменяем каждое значение средним соседей
самый простой способ - при усреднении все соседи имеют одинаковый вес, окрестность берётся прямогуольная, тогда возможны неплохие оптимизации
впрочем, более приятные результаты чаще даёт гауссово сглаживание, там уже оптимизаций меньше возможно



--------------------
qqq
PM WWW   Вверх
cs137
Дата 21.1.2008, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



У меня конечное обратное преобразование имеет вид:
user posted image,
где x1,y1 - точки исходного изображения, а x2,y2 - точки получаемого.

здесь мы имеем 8 коэффициентов вместо 6 для каждого узла сетки.

Цитата
сглаживаем его - заменяем каждое значение средним соседей


т.е. я так понимаю, что мы каждое значение элемента вектора вычисляем из соответствующих значений соседних векторов?


PM MAIL   Вверх
maxim1000
Дата 21.1.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(cs137 @  21.1.2008,  09:35 Найти цитируемый пост)
т.е. я так понимаю, что мы каждое значение элемента вектора вычисляем из соответствующих значений соседних векторов?

да


--------------------
qqq
PM WWW   Вверх
cs137
Дата 21.1.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.8.2007

Репутация: нет
Всего: нет



maxim1000, спасибо Вам большое за помощь. Буду пробовать smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1347 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.