2012-06-17 105 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

啊,哈!很有帮助。感谢您的答复。我一定会考虑这种方法! –