2012-06-17 3 views
2

Я сейчас разрабатываю проект с помощью маммографии, и я пытаюсь понять, как я могу сегментировать изображение на два раздела: область с возможностью поиска (ROI) и область без поиска. Основное внимание в этом вопросе уделяется только основному алгоритму фактического анализа/обработки изображения. Большинство результатов Google и Stack Overflow дали полезные фрагменты информации, но ни один из них не объясняет шаги анализа и обработки изображений и почему эти шаги важны и что именно они делают.OpenCV: Как правильно сегментировать изображение с помощью порогового значения/использовать двоичное изображение для сегментации исходного изображения?

Я написал небольшой сегмент кода, который принимает изображение, изменяет размер изображения и «бинаризует» изображение. (Ниже). Есть ли способ отслеживать строку (Contour?) На моем двоичном изображении, переместить эту строку в исходное изображение и использовать ее в качестве ориентира в том, чтобы мой алгоритм определял области поиска (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 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; 
} 

Затем отслеживать каждую каплю:

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

Вы можете адаптировать их легко искать только прямые линии (я не знаю, нужны ли вам круговые линии). Затем используйте точки пересечения линий, чтобы создать объект с известными линиями для ребер.

В качестве альтернативы вы можете использовать линии и круги Hough (доступные в OpenCV) для отслеживания линий и кругов на изображении для вас. Это имеет смысл давать линии в любой ориентации, но не дает конечных точек прямых линий.

+0

Ах, ха! Очень полезно. Спасибо за ваш ответ. Я обязательно рассмотрю этот подход! –

 Смежные вопросы

  • Нет связанных вопросов^_^