标记C ++中的兴趣点

时间:2015-05-17 03:59:13

标签: c++ matlab opencv

我的项目的目标是检测肺部的结节,在过滤和分类后我得到了这样的二进制图像: enter image description here

我的问题是我不知道如何在原始图像上标记这些兴趣点。在matlab中,我可以通过[hold on-off]循环和一些plot()函数轻松完成。但是我如何在C ++中做到这一点,我不是要将matlab代码翻译成C ++,我只需要在原始图像上用任何必要的方式标记这些PoI。 这是我想要的结果: enter image description here  我在Matlab中做到了

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

2 个答案:

答案 0 :(得分:4)

试试这个......

从您的二进制图像

,您可以提取轮廓。 然后直接绘制轮廓,或提取覆盖整个轮廓的边界圆。

我将介绍两种方法。

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

限定圆圈:

enter image description here

直接绘制轮廓:

enter image description here

只需使用原始图像作为绘图功能的输入。

答案 1 :(得分:1)

你试过了吗?

Mat image;
image = imread(filename, CV_LOAD_IMAGE_COLOR); 

然后在其上使用ellipse

也许,如果您不知道坐标,但只是使用blend

得到了过滤后的图像