C++ OpenCV:如何使用阈值法正确分割图像/使用二进制图像分割原始图像?

C++ OpenCV:如何使用阈值法正确分割图像/使用二进制图像分割原始图像?,c++,opencv,contour,image-segmentation,C++,Opencv,Contour,Image Segmentation,我目前正在开发一个乳房X光摄影项目,我试图理解如何将图像分割为两个部分:可搜索区域(ROI)和不可搜索区域。该问题的焦点仅针对实际图像分析/处理的底层算法。Google和Stack Overflow的大部分结果都提供了一些有用的信息,但没有一个能解释图像分析/处理的步骤,以及为什么这些步骤很重要,以及它们各自在做什么 我已经编写了一个小代码段,用于获取图像,重新调整图像大小,并对图像进行“二值化”。(下图)是否有任何方法可以在我的二值图像上追踪一条线(轮廓?),将这条线移动到我的原始图像,并将其

我目前正在开发一个乳房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;
  }

为了澄清和重申,我查阅了不少教程,但没有任何具体的帮助。我会感激所有能得到的帮助

要在二值化图像上查找行,需要使用递归函数,并创建第二个与图像大小相同的数组,以便存储数据。这是我最近编写的一个代码示例,用于检测二值化图像中的斑点(注意,这是在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;
}
私有列表FindBlobs(bool[]数据,int-Width,int-Height)
{
bool[]IsBlob=新bool[Data.Length];
List BLOB=新列表();
对于(int y=0;y
然后跟踪每个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);
                }
            }
        }
    }
}
private void TrackBlob(Blob Blob,bool[]数据,int x,int y,int Width,int Height)
{
对于(int i=-1;i<2;i++)
{
对于(int j=-1;j<2;j++)
{
如果((x+i)>=0&&(x+i)=0&&(y+j)
你可以很容易地调整这些,只搜索直线(我不知道你是否需要圆线)。然后使用线的交点以已知的线作为边构建对象


或者,可以使用Hough线和圆(在OpenCV中提供)为您跟踪图像上的线和圆。这样做的好处是可以在任何方向上给出直线,但不能给出直线的端点。

啊,哈!非常有用。谢谢你的回复。我一定会考虑这个方法!