OpenCV 仅发现图像边界作为轮廓

OpenCV finds only image border as contour

我想用 RETR_EXTERNAL 获取所有外部轮廓,但出于某种奇怪的原因,openCV 认为图像边界也是一个轮廓,因此丢弃所有内部轮廓。我到底做错了什么?

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat hierarchy = new Mat();
Imgproc.findContours(imageA, contours, hierarchy, Imgproc.RETR_EXTERNAL,
                     Imgproc.CHAIN_APPROX_SIMPLE);

for (int i = 0; i < contours.size(); i++) {
    double[] c = hierarchy.get(0, i);
    Rect rect = Imgproc.boundingRect(contours.get(i));
    Core.rectangle(image, new Point(rect.x, rect.y),
        new Point(rect.x + rect.width, rect.y + rect.height), 
        new Scalar(0, 255, 0), 3);
}

输入(im​​ageA在contour-finding之前被处理成这个):

输出:

编辑: 问题部分解决 反转像素,使黑色为背景,白色为前景,有助于上图。但是,我仍然可以在某些图像上看到内部轮廓。喜欢这个:

输入

输出

您的输入图像不够好,无法提取您想要的轮廓。

您的输入轮廓是这些(图像的一部分):

每种颜色都是一个轮廓(和一些白色的)

对于红色轮廓,我绘制了边界矩形,这与您用来显示轮廓的方法相同。所有其他彩色轮廓都不在红色轮廓内,而是在边界矩形内,这就是为什么即使您选择仅查找外部轮廓也能找到它们的原因。

你真正想要的是这样的:

但要获得该结果,您的输入图像也必须连接椭圆的那条线!!

对于您的输入图像,如果不获取地面线,将很难提取这些线,但一种简单的方法是先使用几个膨胀操作,然后对您的图像进行相同数量的侵蚀操作输入图像,在提取轮廓之前。虽然这对所有设置都不稳定 ;)