OpenCV仅查找图像边框作为轮廓

时间:2015-01-04 23:03:23

标签: java opencv

我想用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);
}

输入(在寻找轮廓之前,imageA已经处理完毕):

Input imageA

输出:

Output of this code

修改 问题部分解决 反转像素,使黑色为背景,白色前景有助于图像上方的图像。但是我仍然在某些图像上获得内部轮廓。像这样:

输入

enter image description here

输出

enter image description here

1 个答案:

答案 0 :(得分:0)

您输入的图像并不适合提取您想要的轮廓。

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

enter image description here

每种颜色都是单个轮廓(以及一些白色轮廓)

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

你真正想要的是这样的:

enter image description here

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

对于你的输入图像,很难提取这些线条,也没有获得地面线条,但一个简单的方法可能是使用几个扩张操作,然后在输入图像上进行相同数量的侵蚀操作,在提取轮廓之前。尽管如此,这对于所有设置都不会稳定;)