Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查曲线是否闭合_Java_Computer Vision_Ocr_Curve - Fatal编程技术网

Java 检查曲线是否闭合

Java 检查曲线是否闭合,java,computer-vision,ocr,curve,Java,Computer Vision,Ocr,Curve,如何有效地检查曲线是否闭合?例如,请看下图: 曲线在黑色背景上始终为白色。 我尝试了洪水填充算法,但在这种情况下效果不佳(我不知道如何修改它) 代码如下: 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.g

如何有效地检查曲线是否闭合?例如,请看下图:

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

代码如下:

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");
            }

        }
    }
}
publicstaticbooleaniswite(buffereImage图像、intposx、intposy){
颜色=新颜色(image.getRGB(posX,posY));
int r=color.getRed();
int g=color.getGreen();
intb=color.getBlue();
如果(r==0&&g==0&&b==0)
返回false;
返回true;
}
公共静态无效检查关闭(BuffereImage bimg){
boolean[][]painted=new boolean[bimg.getHeight()][bimg.getWidth()];
对于(int i=0;i=0)和&(p.x=0)和&(p.y
查看图像中边界是否闭合的方法是从所有图像边缘像素开始对边界进行整体填充。也就是说,将位于图像边缘的所有背景像素放在队列上,然后从那里进行整体填充


接下来,检查是否还有任何背景像素。如果对象内部填充了洪水,则边界未闭合。

请定义“不正常”。它有什么作用?你期望它做什么或不做什么?你试过调试它吗?@M.Prokhorov该算法不符合要求,而是从上到下,从左到右。所以我不知道如何调整它,因为你在图像中迭代点并将它们添加到“队列”中的方式不同。你也不能通过使用另一条单像素线来“跟随”一条像素线,在对角线上会有一些像素的侧面没有白色。但进一步改进的方法是,在形状旁边拾取一个单像素,并且不将洪水传播到距离形状边缘超过2个像素的地方。这大大加快了你的“洪水”速度,让你可以通过观察曲线上的任何一点来测试你的形状是否是开放的:它的两侧都会有一条彩色的边,而不是只有一条。@Mike'Pomax'Kamermans:当然,你可以用它来节省一些时钟周期,特别是当物体是小的w.r.t.图像时。但我仍然建议对整个图像进行简单的整体填充,因为这样您就可以使用现有的实现,而不是创建新的bug如果您在洪水填充实现中引入了bug,那么一定是出了很大的问题。这是一个有很好的文档记录的、非常基本的算法=)(也就是说,如果你不想自己滚动,你可以找到一些不进行完全泛洪但只进行边缘填充的算法,这就足够了)