我的项目目标是检测肺部的结节,经过过滤和分类后,我得到了一个二进制图像,如下所示:
我的问题是我不知道如何在原始图像上标记这些兴趣点。在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] 删除。
我来说两句