【发布时间】:2016-06-29 05:42:02
【问题描述】:
我有一个源图像
我已经应用了一个合适的阈值并得到了这个
现在我使用轮廓来找到内部的黑色斑点。我用绿色表示外边界,用红色表示内边界。这就是我得到的:-
我已经使用红色提取了斑点。但我只想提取那些里面没有绿色的东西,或者至少只给那些里面没有其他轮廓的东西提供内部边界。无论如何要这样做?
EDIT-1:- 我想找到绿色和红色像素的坐标,如果它们彼此非常接近,则将所有读取的像素转换为绿色。但是有人知道如何获取坐标吗?
EDIT-2 我按照 Derman 的方法得到了 80% 的结果。查看另一个源图片及其掩码
代码清楚地识别标记为 1 和 3(绿色和红色)的轮廓,基于它们具有或 dsnt 具有子轮廓的事实。但轮廓 2 显然与轮廓 1 相同,并且具有子轮廓,但仍被视为红色。我会把代码分享给你们,我知道它可能需要做一个小的修改,但它似乎躲过了我-
Mat binMask;
Mat lung_src;
vector<std::vector<cv::Point>> contours;
vector<cv::Vec4i> hierarchy;
int count = 0;
findContours(binMask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
for (int i = 0; i < contours.size(); i++)
{
if (hierarchy[i][2] != -1) // means it has child contour
{
if (count>1)// number of child countors,if its greater than 1 then green else red
{
drawContours(lung_src, contours, i, Scalar(0, 255, 0), 1, 8, hierarchy, 0, Point());
}
else // means it's count is 1 or less
{
drawContours(lung_src, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy, 0, Point());
}
count++;
}
else // means it doesn't have any child contour
{
drawContours(lung_src, contours, i, Scalar(0, 0, 255), 1, 8, hierarchy, 0, Point());
}
}
imshow("lung", lung_src);
imwrite("lung.tiff", lung_src);
lung_src 是上面显示的红色/绿色轮廓图像。
【问题讨论】:
标签: c++ c opencv image-processing image-segmentation