Как программно определить границу изображения? - PullRequest
1 голос
/ 23 декабря 2009

Я ищу программу, которая определяет границы изображения, например у меня есть квадрат и программа обнаруживает X / Y-Coords

Пример:

альтернативный текст http://img709.imageshack.us/img709/1341/22444641.png

Ответы [ 5 ]

5 голосов
/ 23 декабря 2009

Это очень простой детектор краев. Подходит для двоичных изображений. Он просто вычисляет разницу между горизонтальными и вертикальными пикселями, например, image.pos [1,1] = image.pos [1,1] - image.pos [1,2] и то же самое для вертикальных разностей. Имейте в виду, что вам также необходимо нормализовать его в диапазоне значений 0..255.

Но! если вам просто нужна программа, используйте Adobe Photoshop.

Код написан на C #.

public void SimpleEdgeDetection()
{
    BitmapData data = Util.SetImageToProcess(image);
    if (image.PixelFormat != PixelFormat.Format8bppIndexed)
        return;

    unsafe
    {
        byte* ptr1 = (byte *)data.Scan0;
        byte* ptr2;
        int offset = data.Stride - data.Width;
        int height = data.Height - 1;
        int px;

        for (int y = 0; y < height; y++)
        {
            ptr2 = (byte*)ptr1 + data.Stride;
            for (int x = 0; x < data.Width; x++, ptr1++, ptr2++)
            {
                px = Math.Abs(ptr1[0] - ptr1[1]) + Math.Abs(ptr1[0] - ptr2[0]);
                if (px > Util.MaxGrayLevel) px = Util.MaxGrayLevel;
                ptr1[0] = (byte)px;
            }
            ptr1 += offset;
        }
    }
    image.UnlockBits(data);
}

Метод из класса Util

static public BitmapData SetImageToProcess(Bitmap image)
{
    if (image != null)
        return image.LockBits(
            new Rectangle(0, 0, image.Width, image.Height),
            ImageLockMode.ReadWrite,
            image.PixelFormat);

    return null;
}

Если вам нужно больше объяснений или алгоритмов, просто спросите больше информации, не будучи настолько общими.

4 голосов
/ 23 декабря 2009

Вы можете использовать любую библиотеку обработки изображений, например Opencv . который находится в C ++ или Python. Вы должны искать функции обнаружения края, такие как обнаружение края Canny. Конечно, это потребует некоторого погружения в обработку изображений. Пример изображения, который вы дали, должен быть прямым, чтобы определить, насколько шумными / разнообразными будут изображения?

3 голосов
/ 23 декабря 2009

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

1 голос
/ 23 декабря 2009

A алгоритм распознавания формы может вам помочь, если он имеет какую-то сплошную границу, а цвет фона - сплошной.

0 голосов
/ 23 декабря 2009

По звукам, вы просто хотите алгоритм извлечения BLOB-объектов . После этого самые низкие / самые высокие значения для x / y дадут вам координаты углов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...