首页 > 解决方案 > 我正在尝试构建一个跟踪方法,以 2dArray 的形式跟踪图片轮廓的坐标

问题描述

对于一个学校项目,我正在尝试建立一个跟踪方法。它应该基于 EdgeDetection 方法中的 Array 来跟踪形状轮廓的坐标。我确保轮廓只有一个像素厚。因为它是一个项目,所以我不能使用库中的任何花哨的技巧。

到目前为止,我正在使用嵌套的 forloop 来查找形状的开头。然后我使用这样的形状:

p9  p2  p3
p8  p1  p4
p7  p6  p5

p1 是我在数组中的当前位置,然后我在 p2-p9 中搜索下一个位置。

到目前为止的代码如下所示:

private static String traceCoordinates(int o[][])
{

    String useless = null; 
    //int[][] n = new int[m[0].length][m.length];
    //int[][] o = new int[n.length][n[0].length];

   // n = transpose(m);
    //o = thinning(n);

    int hits = 0;
    System.out.print("        ");
    for (int a = 0; a < 1; a++)
    {
        for (int b = 0; b < o[0].length; b++)
        {
            String c = String.format("%3s", b);
            System.out.print(c + " ");
        }System.out.println("");
    }

    for (int y = 0; y < o.length; y++)
    {
        //String e = String.format("%3s", y).replace(" ", "0");
        //System.out.print("row" + e + " ");
        for (int x = 0 ; x < o[0].length ; x++)
        {
            if (o[y][x] == 0)
            {
                int xEnd = x;
                int yEnd = y;

                int a = y + 1;
                int b = y - 1;
                int c = x + 1;
                int d = x - 1;

                /*
                Her findes værdien af de 8 nabopixler på baggrund af deres indbyrdes index.
                */
                int p2 = o[b][x];
                int p3 = o[b][c];
                int p4 = o[y][c];
                int p5 = o[a][c];
                int p6 = o[a][x];
                int p7 = o[a][d];
                int p8 = o[y][d];
                int p9 = o[b][d];

                do
                {

                    System.out.println(y + ";" + x + " " + "begin");
                    if (p2 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        y--;
                        System.out.print("Next point: ");
                        System.out.println("2; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p3 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                       o[y][x] = 66;
                        y--;
                        x++;
                        System.out.print("Next point: ");
                        System.out.println("3; " + pntC(x, y) + " ");;
                        hits++;
                    }
                    else if (p4 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        x++;
                        System.out.print("Next point: ");
                        System.out.println("4; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p5 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        x++;
                        y++;
                        System.out.print("Next point: ");
                        System.out.println("5; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p6 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        y++;
                        System.out.print("Next point: ");
                        System.out.println("6; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p7 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        x--;
                        y++;
                        System.out.print("Next point: ");
                        System.out.println("7; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p8 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        x--;
                        System.out.print("Next point: ");
                        System.out.println("8; " + pntC(x, y) + " ");
                        hits++;
                    }
                    else if (p9 == 0 && hits < 1)
                    {
                        System.out.print("This point: ");
                        System.out.print(pntC(x, y) + " ");
                        o[y][x] = 66;
                        x--;
                        y--;
                        System.out.print("Next point: ");
                        System.out.println("9; " + pntC(x, y) + " ");
                        hits++;
                    }
                    System.out.println(y + ";" + x + " " + "end");
                    hits = 0;

                }while(o[y][x] == 0);   
                System.out.println("loop\n");



            }

        }
        System.out.println("");
    }System.out.println(hits);
    for( int row = 0 ; row < o.length ; row++)
    {//start row for loop
        String e = String.format("%3s", row);
        System.out.print("row" + e + " ");
        for (int column = 0 ; column < o[0].length ; column++)
        {// start column for loop
                           if (o[row][column] == 255)
                            {
                                       System.out.print("___|");
                            }
                           else
                           {
                               System.out.print("   " + o[row][column]);
                           }
        }// end colum for loop

        System.out.println(" end row");
    }// end row for loop
return useless;    
}

完成后,跟踪通过 StringBuilder 作为字符串返回,因此是无用的变量。

我的问题是我的方法只能检测到一个方向的线。当该方向上没有更多像素时,它会跳出循环。

我正在练习以下数组:

int[][] A = new int[][]
    {
        {1,  2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21, 22},
        {2,  0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 2},
        {3,  255, 0,   0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 2},
        {4,  255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 2},
        {5,  255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 2},
        {6,  255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 2},
        {7,  255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 2},
        {8,  255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 2},
        {9,  255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {10, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {11, 255, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {12, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {13, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {14, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {15, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {16, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {17, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {18, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {19, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {20, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {21, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2},
        {1,  2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,  20,  21, 22}
    };

我希望看到返回的是这样的:

1;1 2;2 2;3 3;4 4;4 5;5 6;6 7;7 8;8 9;9 10;10 9;11 8;12 7;13 6;14 5;15 4;16 3;17 2;18 1;19

以该顺序。

现在该方法的实际输出是:

1;1 begin

此点:001/001 下点:5;002/002
2;2 结束 2;2 开始这一点:002/002 下一点:5;003/003
3;3 结束循环

3;4 开始这一点:004/003 下一点:6;004/004
4;4 结束 4;4 开始这一点:004/004 下一点:6;004/005
5;4 结束循环

5;5 开始这一点:005/005 下一点:5; 006/006
6;6 结束 6;6 开始这一点:006/006 下一点:5;007/007
7;7 结束 7;7 开始 此点:007/007 下点:5;008/008
8;8 end 8;8 begin 此点:008/008 下点:5; 009/009
9;9 结束 9;9 开始这一点:009/009 下一点:5;010/010
10;10 结束 10;10 开始这一点:010/010 下一点:5;011/011
11;11 结束循环

我怎样才能使这项工作?

标签: javaarraystraceedge-detection

解决方案


对于轮廓跟踪,仅知道当前像素是不够的。您还需要到达它的方向。然后,从当前方向开始,围绕当前像素(顺时针或逆时针)旋转,开始寻找下一个像素。

因此,您的表应该有 8 x 256 个条目。或者,您可以依次尝试 8 个邻居(实际上 6 个就足够了)。不同的空间/时间折衷是可能的。

要启动遍历,您可以查找一个像素被一个空白包围的配置,然后是一个像素。停止标准有点棘手。为了正确起见,您应该在回到初始像素时停下来,准备继续朝同一方向前进。

在此处输入图像描述


推荐阅读