Алгоритм преобразования изображения - PullRequest
4 голосов
/ 08 июня 2009

Я разрабатывал (в течение последних 3 часов) небольшой проект, который я делаю на C #, чтобы помочь мне выбрать дом.

В частности, я размещаю статистику преступности на картах Google, чтобы найти хороший район.

Вот пример: http://otac0n.com/Demos/prospects.html

Теперь я вручную нашел значения Lat и Lng, совпадающие с углами карты, показанной в примере, но у меня есть еще несколько карт для наложения.

Мое новое приложение позволяет мне выбирать ориентир и указывать на изображение, чтобы привязать пиксель к LatLng. Что-то вроде:

locations.Add(new LocationPoint(37.6790f, -97.3125f, "Kellogg and I-135"));

// and later...

targetPoint.Pixel = FindPixel(mouseEvent.Location);

Итак, я собрал список комбинаций пиксель / широта и теперь хотел бы преобразовать изображение (используя аффинные или неаффинные преобразования).

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

Есть ли у кого-нибудь опыт выполнения преобразований изображений в C #? Как мне найти правильный поворот, чтобы сделать уровень карты?

После того, как дело с хорошо сделанными картами будет решено, мне бы хотелось иметь возможность накладывать карты, нарисованные от руки. Это, очевидно, повлечет за собой сильное искажение конечного изображения и может выходить за рамки этой первой итерации. Однако я не хотел бы разрабатывать систему, которая в будущем не будет расширяться до этой системы.

Ответы [ 3 ]

3 голосов
/ 09 июня 2009

Я не уверен, чего именно вы хотите достичь, но если вы хотите совместить более трех точек на одной карте с более чем тремя точками на другой, в принципе, есть два способа:

  1. Вы можете попытаться создать треугольную сетку над своими точками, а затем применить различные аффинные преобразования в каждом треугольнике и получить кусочно-линейное преобразование. Для правильного построения сетки вам, вероятно, потребуется выполнить что-то вроде триангуляции Делоне из точек, для которых qhull , вероятно, должно быть вашим предпочтительным вариантом.
  2. Вы можете пойти на преобразование более высокого порядка, например искажение квадрата , но, вероятно, будет трудно найти решение, которое работает для любого количества точек в общей позиции. Найдите себе хорошую книгу о методах конечных элементов и прочитайте главу (ы) о изопараметрических элементах более высокого порядка, как лагранжевых, так и случайных, которые обеспечат вам хорошо организованные отображения многих точек на многие точки. Вот пара ссылок ( 1 и 2 ), чтобы указать вам путь. Но имейте в виду, что математическое содержание интенсивно ...
2 голосов
/ 08 июня 2009

В 2D пространстве аффинное преобразование может быть задано двумя наборами из трех нелинейных 2D точек. В C # вы можете использовать следующую процедуру для вычисления соответствующей матрицы:

    public static Matrix fit(PointF[] src, PointF[] dst) {
        Matrix m1 = new Matrix(new RectangleF(0, 0, 1, 1), src);
        m1.Invert();
        Matrix m2 = new Matrix(new RectangleF(0, 0, 1, 1), dst);
        m2.Multiply(m1);
        return m2;
    }

Работает для обоих аргументов массива, имеющих 3 элемента.

Если вам нужны только ротация и перевод, вы можете использовать следующую процедуру:

    public static Matrix fitOrt(PointF src1, PointF src2, PointF dst1, PointF dst2) {
        return fit(new PointF[] { src1, src2, ort(src1, src2) },
                new PointF[] { dst1, dst2, ort(dst1, dst2) });
    }

    public static PointF ort(PointF p, PointF q) {
        return new PointF(p.X + q.Y - p.Y, p.Y - q.X + p.X);
    }

Если вы хотите найти наилучшее приближение между двумя наборами нескольких точек, то вы можете начать с этого http://elonen.iki.fi/code/misc-notes/affine-fit/

0 голосов
/ 09 июня 2009

Beautiful.

Итак, благодаря указанию Джейми я нашел это:

Триангуляция Делоне в .NET 2.0

http://local.wasp.uwa.edu.au/~pbourke/papers/triangulate/morten.html

На данный момент, это в значительной степени упрощено до lerping.

...