【问题标题】:Check if a curve is closed检查曲线是否闭合
【发布时间】:2018-07-30 11:15:26
【问题描述】:

如何有效地检查曲线是否闭合?例如看这个图:

曲线将始终为黑色背景上的白色。 我尝试了洪水填充算法,但在这种情况下效果不佳(我不明白如何修改它)。

代码如下:

public static boolean isWhite(BufferedImage image, int posX, int posY) {
    Color color = new Color(image.getRGB(posX, posY));
    int r=color.getRed();
    int g=color.getGreen();
    int b=color.getBlue();
    if(r==0&&g==0&&b==0)
        return false;
    return true;
}

public static void checkClosed(BufferedImage bimg) {

    boolean[][] painted = new boolean[bimg.getHeight()][bimg.getWidth()];

    for (int i = 0; i < bimg.getHeight(); i++) {
        for (int j = 0; j < bimg.getWidth(); j++) {

            if (isWhite(bimg, j, i) && !painted[i][j]) {

                Queue<Point> queue = new LinkedList<Point>();
                queue.add(new Point(j, i));

                int pixelCount = 0;
                while (!queue.isEmpty()) {
                    Point p = queue.remove();

                    if ((p.x >= 0) && (p.x < bimg.getWidth() && (p.y >= 0) && (p.y < bimg.getHeight()))) {
                        if (!painted[p.y][p.x] && isWhite(bimg, p.x, p.y)) {
                            painted[p.y][p.x] = true;
                            pixelCount++;


                            queue.add(new Point(p.x + 1, p.y));
                            queue.add(new Point(p.x - 1, p.y));
                            queue.add(new Point(p.x, p.y + 1));
                            queue.add(new Point(p.x, p.y - 1));
                        }
                    }
                }
                System.out.println("Blob detected : " + pixelCount + " pixels");
            }

        }
    }
}

【问题讨论】:

  • 请定义“效果不佳”。它有什么作用?您希望它做什么或不做什么?你试过调试吗?
  • @M.Prokhorov 算法不遵循这条线,而是从上到下,从左到右。所以我不明白如何适应它
  • 这不是因为您在图像中迭代点并将它们添加到“队列”中的方式。您也不能通过使用另一条单像素线来“跟随”一条像素线,在对角线上会有一些像素边上没有白色。

标签: java computer-vision ocr curve


【解决方案1】:

查看图像中的边界是否闭合的方法是从所有图像边缘像素开始对边界进行泛光填充。也就是说,您将位于图像边缘的所有背景像素放入队列中,然后从那里填充填充。

接下来,检查是否有剩余的背景像素。如果填充填充在对象内部,则边界没有关闭。

【讨论】:

  • 但是通过选择形状旁边的单个像素来进一步改进这一点,而不是将洪水传播到距离形状边缘超过 2 个像素的地方。这会大大加快你的“洪水”速度,并让你通过查看曲线上的任何点来测试你的形状是否开放:它的两侧都会有一个彩色边缘,而不仅仅是一个。
  • @Mike'Pomax'Kamermans:当然,你可以用它来节省一些时钟周期,特别是如果对象很小 w.r.t。图片。但我仍然建议对整个图像进行简单的泛洪填充,因为这样您就可以使用现有的实现而不是创建新的错误。 ;)
  • 如果你在洪水填充实现中引入了错误,那么事情就很不对劲了。这是一个有据可查的,非常基本的算法=)(也就是说,如果你不想自己滚动,你可以找到几个不做全洪水但只做边缘填充的,这已经足够了这个目的)
猜你喜欢
  • 2011-09-28
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多