2012-06-17 4 views
2

저는 현재 유방 조영술을 사용하여 프로젝트를 개발 중이며 이미지를 검색 가능한 영역 (ROI)과 검색 불가능한 영역으로 나눌 수있는 방법을 이해하려고합니다. 이 질문의 초점은 실제 이미지 분석/처리의 기본 알고리즘에만 적용됩니다. Google 및 스택 오버플로의 결과는 대부분 유용한 정보를 제공하지만 이미지 분석/처리 단계와 이러한 단계가 중요한 이유 및 각각 정확히 무엇인지 설명하지는 않습니다.OpenCV : 어떻게 임계 값으로 이미지를 올바르게 분할 할 수 있습니까?/이진 이미지를 사용하여 원본 이미지를 분할 할 수 있습니까?

이미지를 가져 와서 이미지의 크기를 조정하고 이미지를 '2 진화'하는 작은 코드 세그먼트를 작성했습니다. (아래). 내 바이너리 이미지에서 선 (등고선)을 추적하고,이 선을 원래 이미지로 이동하고, 알고리즘이 비 알고리즘의 검색 가능 영역 (ROI)을 결정하도록 가이드 라인으로 사용할 수있는 방법이 있습니까? 검색 가능한 영역? 이 작업을 수행하는 간단한 방법이 있습니까?

// ** Main ** // 
int main(int argc, char** argv) 
{ 
    /// Load an image 
    src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE); 

    // Create Dummy Image 
    Mat destination; 
    destination = cvCreateMat(3328/5, 4084/5, CV_32FC1); 
    resize(src, destination,cvSize(3328/5,4084/5),0,0); 
    src = destination; 

    /// Create a matrix of the same type and size as src (for dst) 
    dst.create(src.size(), src.type()); 

    /// Create a window 
    namedWindow(window_name, CV_WINDOW_AUTOSIZE); 

    // Binarize the Image 
    threshold(src, dst, 128, 255,CV_THRESH_BINARY | CV_THRESH_OTSU); 

    // Show the Image 
    imshow(window_name, dst); 

    /// Wait until user exit program by pressing a key 
    waitKey(0); 

    return 0; 
    } 

명확한 설명과 반복을 위해 필자는 많은 자습서를 살펴 보았지만 특별히 이에 대한 도움은 없었습니다. 내가 얻을 수있는 모든 도움에 감사드립니다!

답변

2

이진화 된 이미지에서 행을 찾으려면 재귀 함수를 사용해야하고 데이터를 저장할 수있는 이미지와 동일한 크기의 두 번째 배열을 만들어야합니다. 이것은 최근에 내가 방울을 감지하도록 작성한 코드의 예입니다 이진화 된 이미지에서 (참고로, 이것은 C#에서, 목록보다는 벡터 <> 사용과 같은 약간의 적응이 필요합니다).
첫째, 추적 가치가 있는지 여부를 확인하기 위해 픽셀을 분석/추적되지 않은 : 단지 바로 검색에 쉽게

private void TrackBlob(Blob blob, bool[] Data, int x, int y, int Width, int Height) 
{ 
    for (int i = -1; i < 2; i++) 
    { 
     for (int j = -1; j < 2; j++) 
     { 
      if ((x + i) >= 0 && (x + i) < Width && (y + j) >= 0 && (y + j) < Height) 
      { 
       if (Data[(y + j) * Width + (x + i)]) 
       { 
        Data[(y + j) * Width + (x + i)] = false; 
        blob.AddPoint((x + i), (y + j)); 
        TrackBlob(blob, Data, x + i, y + j, Width, Height); 
       } 
      } 
     } 
    } 
} 

당신이 적응할 수 :

private List<Blob> FindBlobs(bool[] Data, int Width, int Height) 
{ 
    bool[] IsBlob = new bool[Data.Length]; 
    List<Blob> Blobs = new List<Blob>(); 

    for (int y = 0; y < Height; y++) 
    { 
     for (int x = 0; x < Width; x++) 
     { 
      if (Data[y * Width + x]) 
      { 
       Blob b = new Blob(); 
       TrackBlob(b, Data, x, y, Width, Height); 
       Blobs.Add(b); 
      } 
     } 
    } 
    return Blobs; 
} 

그런 다음 각각의 덩어리를 추적 라인 (나는 당신이 원형 라인이 필요한지 모르겠다). 그런 다음 선의 교차점을 사용하여 모서리에 대해 알려진 선이있는 객체를 작성합니다.

또는 Hough Lines and Circles (OpenCV에서 사용 가능)를 사용하여 이미지의 선과 원을 추적 할 수 있습니다. 이것은 임의의 방향으로 선을주는 이점이 있지만 직선의 끝점을 제공하지는 않습니다.

+0

아, 하! 매우 도움이됩니다. 답장을 보내 주셔서 감사합니다. 나는이 접근법을 확실히 고려할 것입니다! –

관련 문제