2009-12-23 3 views
1

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

Пример:

alt text http://img709.imageshack.us/img709/1341/22444641.png

+1

border! = Xy координаты. Пожалуйста, уточните свой вопрос. Кроме того, какие языки и платформы (ы) вы спрашиваете? – 2009-12-23 19:22:00

+1

Это больше похоже на SVG, он хочет иметь внешние координаты/границы графического элемента; ! [Alt text] [1] [1]: http://img31.imageshack.us/img31/5449/76190433.png – user237060

+0

ПРИМЕЧАНИЕ: я не хочу код, я хочу больше программы! – user237060

ответ

0

От звуки этого, вы просто хотите blob extraction algorithm. После этого самые низкие/самые высокие значения для x/y дадут вам координаты углов.

+0

Да, но я думаю, вам нужно сначала применить детектор границы, чтобы отличать внутренние пиксели объекта от граничных пикселей объекта. – Andres

+0

Судя по комментариям, сделанным после моего сообщения, похоже, что у него есть изображение, подобное выше, и требуется координаты углов некоторого заполненного многоугольника. Я предполагаю, что мой следующий вопрос будет, всегда ли он выпуклый? –

3

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

4

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

+0

Canny был бы излишним для такого изображения. Простая комбинация градиентных фильтров будет делать то, что ему нужно. – monksy

+0

Все зависит от того, с какими условиями вы хотите справиться (как уже упоминалось - насколько шумно будет изображение) – elijah

+0

Учитывая, что его образец, показанный в заголовке orignal, может быть чрезмерным – monksy

5

Это очень простой детектор кромок. Он подходит для двоичных изображений. Он просто вычисляет различия между горизонтальными и вертикальными пикселями, такими как 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; 
} 

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