2012-06-17 129 views
2

我目前正在開發一個帶有乳房X線照相的項目,並且試圖理解如何將圖像分爲兩部分:可搜索區域(ROI)和不可搜索區域。這個問題的重點僅針對實際圖像分析/處理的基本算法。 Google和Stack Overflow的大部分結果都提供了有用的信息,但是他們都沒有解釋圖像分析/處理的步驟,以及爲什麼這些步驟很重要,以及它們究竟做了什麼。OpenCV:如何正確分割圖像與閾值/使用二進制圖像來分割原始圖像?

我已經寫了一個小代碼段,它會拍攝一張圖像,重新調整圖像的大小,並對圖像進行「二值化處理」。 (下面。)有什麼方法可以在我的二進制圖像上跟蹤一條線(輪廓?),將這條線移動到我的原始圖像,並將其用作指南,讓我的算法從非圖像區域確定可搜索區域(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

要找到二值化圖像上的行,您需要使用遞歸函數,並創建與可以存儲數據的圖像大小相同的第二個數組。這是我最近編寫的用於檢測blob的代碼示例在一個二進制化的圖像中(注意,這是在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和Circles(OpenCV中可用)跟蹤圖像上的線條和圓圈。這有利於給任何方向的線條,但它不會給出直線的端點。

+0

啊,哈!很有幫助。感謝您的答覆。我一定會考慮這種方法! –