我正在尝试构建一个跟踪方法,以 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];


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


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


缥缈止盈
浏览 90回答 1
1回答

当年话下

对于轮廓跟踪,仅知道当前像素是不够的。您还需要到达它的方向。然后,从当前方向开始,围绕当前像素(顺时针或逆时针)旋转,开始寻找下一个像素。因此,您的表应该有 8 x 256 个条目。或者,您可以依次尝试 8 个邻居(实际上 6 个就足够了)。不同的空间/时间折衷是可能的。要启动遍历,您可以查找一个像素被一个空白包围的配置,然后是一个像素。停止标准有点棘手。为了正确起见,您应该在回到初始像素时停下来,准备继续朝同一方向前进。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java