2009-12-23 4 views
1

, 예를 들어 나는 사각형이 프로그램은 X/Y-좌표이미지 테두리를 프로그래밍 방식으로 감지하는 방법은 무엇입니까? 나는 이미지의 가장자리를 감지하는 프로그램을 찾고 있어요

예 감지 :에서

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

+1

경계! = xy 좌표. 귀하의 질문을 명확히하십시오. 또한 어떤 언어 및 플랫폼에 대해 질문하십니까? –

+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 + + 또는 파이썬 있습니다. 캐니 에지 감지와 같은 가장자리 감지 기능을 찾아야합니다. 물론 이것은 이미지 처리에 대한 다이빙을 필요로합니다. 예제 이미지는 감지하기 쉽고, 이미지가 얼마나 시끄럽고 다양합니까?

+0

대머리는 그런 이미지를 너무 과장 할 것입니다. 그래디언트 필터의 간단한 조합은 그가 필요로하는 것을 할 것입니다. – monksy

+0

모두 처리 할 조건에 달려 있습니다 (언급 한대로 - 이미지가 얼마나 시끄러 웠는지) – elijah

+0

orignal post에 표시된 그의 샘플이 지나치게 잔인 함을 감안할 때 – monksy

1

shape recognition algorithm은 어떤 종류의 단색 테두리를 제공하면 도움이 될 수 있으며 배경색은 단색입니다.

5

매우 간단한 가장자리 감지기입니다. 바이너리 이미지에 적합합니다. 그것은 단지 image.pos [1,1] = image.pos [1,1] - image.pos [1,2]와 같은 수평 픽셀과 수직 픽셀의 차이를 계산하고 수직 차이에 대해서도 동일합니다. 값 0..255 범위에서 정규화해야한다는 점에 유의하십시오.

하지만! 프로그램이 필요하면 Adobe Photoshop을 사용하십시오.

코드는 C#으로 작성되었습니다. 백분율 클래스

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; 
} 

에서

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); 
} 

방법 당신은 너무 일반적으로하지 않고 더 많은 정보 요청 더 설명 또는 알고리즘을 필요로합니다.

관련 문제