2

我目前正在开发一个带有乳房 X 线摄影术的项目,并且我正在尝试理解如何将图像分割成两个部分:可搜索区域 (ROI) 和不可搜索区域。这个问题的重点仅针对实际图像分析/处理的底层算法。来自 Google 和 Stack Overflow 的大多数结果都产生了有用的信息,但它们都没有解释图像分析/处理的步骤以及为什么这些步骤很重要以及它们各自在做什么。

我编写了一个小代码段,它获取图像、重新调整图像大小并“二值化”图像。(如下。)有什么方法可以在我的二进制图像上追踪一条线(轮廓?),将这条线移动到我的原始图像,并将其用作让我的算法确定可搜索区域(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;
  }

为了澄清和重申,我查看了很多教程,但没有任何帮助,特别是。我将不胜感激我能得到的所有帮助!

4

1 回答 1

2

要在二值化图像上查找线条,您需要使用递归函数,并创建第二个数组,其大小与您可以存储数据的图像相同。这是我最近编写的用于检测二值化图像中的斑点的代码示例(注意,这是在 C# 中,需要进行一些调整,例如使用 vector<> 而不是 list)。
首先,分析一个像素,看它是否值得追踪/尚未被追踪:

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

然后跟踪每个 blob:

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

您可以轻松地将它们调整为仅搜索直线(我不知道您是否需要圆形线)。然后使用线的交点来构建一个具有已知边缘线的对象。

Alternatively, you can use Hough Lines and Circles (available in OpenCV) to trace lines and circles on the image for you. This has the benefit of giving lines in any orientation, but it does not give end points of straight lines.

于 2012-06-18T01:26:36.440 回答