首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV:如何使用阈值分割图像/使用二进制图像来分割原始图像?

OpenCV:如何使用阈值分割图像/使用二进制图像来分割原始图像?
EN

Stack Overflow用户
提问于 2012-06-18 07:29:54
回答 1查看 2.9K关注 0票数 2

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

我已经写了一小段代码,它获取图像,重新调整图像大小,并对图像进行“二值化”。(如下所示)有没有什么方法可以追踪一条线(等高线?)在我的二进制图像上,将这一行移动到我的原始图像,并将其用作让我的算法从不可搜索区域确定可搜索区域(ROI)的准则。有没有更简单的方法来做这件事?

代码语言:javascript
运行
复制
// ** 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;
  }

为了澄清和重申,我已经研究了相当多的教程,但没有任何特别的帮助。如果能得到所有的帮助,我将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-18 09:26:36

要在二进制化的图像上查找行,需要使用递归函数,并创建与图像大小相同的第二个数组,以便在其中存储数据。这是我最近编写的一个代码示例,用于检测二进制图像中的斑点(注意,这是在C#中,需要进行一些调整,例如使用vector<>而不是list )。

首先,分析一个像素,看看它是否值得跟踪/还没有被跟踪:

代码语言:javascript
运行
复制
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;
}

然后跟踪每个斑点:

代码语言:javascript
运行
复制
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);
                }
            }
        }
    }
}

你可以很容易地将它们调整为只搜索直线(我不知道你是否需要圆形直线)。然后使用这些线的交点来构建一个具有已知线作为边的对象。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11075607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档