我的项目的目标是检测肺部的结节,在过滤和分类后我得到了这样的二进制图像:
我的问题是我不知道如何在原始图像上标记这些兴趣点。在matlab中,我可以通过[hold on-off]循环和一些plot()函数轻松完成。但是我如何在C ++中做到这一点,我不是要将matlab代码翻译成C ++,我只需要在原始图像上用任何必要的方式标记这些PoI。 这是我想要的结果: 我在Matlab中做到了
编辑:我已经从我的程序中获得了积分的位置(正如你在第一张图片中看到的那样)我想要做的就是在原始图像上绘制它们,就像第二张图像一样。答案 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;
}
限定圆圈:
直接绘制轮廓:
只需使用原始图像作为绘图功能的输入。
答案 1 :(得分:1)