在C ++中标记兴趣点

亨潘

我的项目目标是检测肺部的结节,经过过滤和分类后,我得到了一个二进制图像,如下所示: 在此处输入图片说明

我的问题是我不知道如何在原始图像上标记这些兴趣点。在matlab中,我可以使用[hold-on-off]一个循环和一些plot()函数轻松地做到这一点。但是,我该如何在C ++中做到这一点,我并不是要将Matlab代码转换为C ++,我只需要以任何必要的方式在原始图像上标记这些PoI。这是我想要的结果:在此处输入图片说明我是在Matlab中完成的

编辑:我已经从程序中获得了点的位置(如您在第一张图中看到的),我要做的就是像第二张图一样在原始图像上绘制它们。

米卡

尝试这个...

从二进制图像中,您可以提取轮廓。然后,要么直接绘制轮廓,要么提取覆盖整个轮廓的边界圆。

我将介绍两种方法。

int main()
{
    cv::Mat input = cv::imread("../inputData/markMatlab.png");

    cv::Mat gray;
    cv::cvtColor(input, gray, CV_BGR2GRAY);


    cv::Mat binaryImage = gray>0;
    cv::imshow("binary image", binaryImage);
    // here you start

    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(binaryImage, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

    // either this:
    cv::Mat inputBlobs = input.clone(); // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::Point2f blobCenter;
        float blobRadius;
        cv::minEnclosingCircle(contours[i], blobCenter, blobRadius);

        cv::circle(inputBlobs, blobCenter, blobRadius, cv::Scalar(0,0,255), 2);
    }

    // or this one:
    cv::Mat inputContours = input.clone();  // create output image
    for(unsigned int i=0; i<contours.size(); ++i)
    {
        cv::drawContours(inputContours, contours, i, cv::Scalar(0,0,255), 2);
    }






    cv::imshow("input", input);
    cv::imshow("input blobs", inputBlobs);
    cv::imshow("input contours", inputContours);
    cv::imwrite("../outputData/markMatlab.png", input);
    cv::imwrite("../outputData/markMatlabBlobs.png", inputBlobs);
    cv::imwrite("../outputData/markMatlabContours.png", inputContours);
    cv::waitKey(0);
    return 0;
}

边界圆:

在此处输入图片说明

直接绘制轮廓:

在此处输入图片说明

只需将原始图像用作绘图功能的输入即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章