OpenCV中的斑点提取

Posted

技术标签:

【中文标题】OpenCV中的斑点提取【英文标题】:Blob extraction in OpenCV 【发布时间】:2011-01-09 21:09:28 【问题描述】:

我正在使用 OpenCV 为图像过滤某些颜色,所以我得到了检测区域的二值图像。

现在我想侵蚀这些区域,然后去除较小的区域,并找到最大“blob”的 x,y 坐标

我正在寻找关于最好使用什么库的建议?我见过 cvBlob 和 cvBlobsLib 但我不太确定如何设置它们。我想将它们与项目一起编译,还是想将它们编译并安装到系统中(就像我对 OpenCV 所做的那样)?

我目前在 Ubuntu 上使用 Code::Blocks IDE(尽管这不应该限制)

【问题讨论】:

【参考方案1】:

我迟到了,但我想插一句,有一种方法可以在 opencv 中连接组件,只是还没有主线。

更新:它是主线的,它只是被卡在等待 3.0 发布多年。 Linky to documentation

见http://code.opencv.org/issues/1236和http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

免责声明 - 我是作者。

【讨论】:

干得好杰森。我已经集成了你的补丁,它似乎运行良好。速度也不错。也许添加一些属性函数也会很棒(如面积、质心等)。无论如何,感谢您的出色工作。我希望 OpenCV 团队尽快整合你的补丁。这是 OpenCV 恕我直言的严重缺乏,特别是因为其他库已经过时并且只使用 IplImage*... 现在在 api 中了吗?如果是,文档的链接将对未来的读者有所帮助。【参考方案2】:

您可以使用findContours 来执行此操作,请参阅opencv manual 和Tutorial to find connected components。


编辑:教程中的代码(通过 Archive.org)

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char *argv[])

    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/
    CvMemStorage *mem;
    CvSeq *contours, *ptr;
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) 
        CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
        cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
    

    cvSaveImage("result.png", cc_color);
    cvReleaseImage(&img);
    cvReleaseImage(&cc_color);
    return 0;

【讨论】:

这看起来也很有希望,只是看看如何找到最大的轮廓/blob - 谢谢:) 我认为你可以计算轮廓的面积。有一些功能。 是的,我刚刚计算了轮廓边界框的面积,它完成了这项工作 第二个链接失效了,第一个好像也没有反应,能不能更新一下 Archive.org 上的第二个链接仍然有效 - 答案可以更新 web.archive.org/web/20110505194913/http://…【参考方案3】:

不幸的是,OpenCV 没有任何连接组件标记功能,这对于计算机视觉库来说似乎是一个严重的遗漏。无论如何,我最近有类似的要求,所以我实现了自己的 CCL 例程 - CCL Wikipedia page 上描述了几种不同的算法,它们都非常易于实现。

【讨论】:

这似乎是最好的选择,谢谢 :) 这似乎是对 OpenCV 的巨大疏忽,你是对的。 OpenCV 站点上有一个第三方 blobs 库(cvBlobsLib 或类似的),但我看了看,代码质量不是很好。我认为在这种情况下最好自己动手。 在另一个答案中提到,findContours 没有给出相当于连接组件标签的功能吗? @carnieri:这取决于您尝试收集的信息类型 -​​ cvFindContours 将多边形拟合到斑点,您可以从这些多边形中获取 一些 种信息,但在在我的情况下,我需要知道每个 blob 中连接像素的数量,而 cvFindContours 似乎无法做到这一点。使用常规 CCL 算法虽然它非常简单(只是标签值的直方图)。 很高兴知道 - 如果@amr 还在,那么理想情况下,他现在应该将您的答案标记为已接受,而不是我的过时答案。【参考方案4】:

我认为使用 OpenCV 处理 blob 的最佳且简单的选择是使用 cvBlob 库。它是一个带有 OpenCV 的补充库,非常易于使用。

【讨论】:

以上是关于OpenCV中的斑点提取的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 进行斑点检测

openCV C++ 将对象/斑点减少到质心

OpenCV 检测图像上的斑点

OpenCV - 在二进制图像中找到最大斑点的边界框

OpenCV blob(斑点)特征,SimpleBlobDetector

python使用opencv对图像添加(高斯/椒盐/泊松/斑点)噪声