Java中的连接组件标签

时间:2014-04-07 14:02:00

标签: java components

我目前正在尝试创建一些Java代码来执行连接组件标记。

有关其工作原理的解释如下:http://aishack.in/tutorials/labelling-connected-components-example/

我已经在我的代码中找到了一点,我正在查看像素并比较它周围的所有像素。我现在完全迷失了,我很难找到用于存储像素是背景像素,先前发现的物体还是新物体的内容。

我的问题是我打电话或更改以允许我存储这些值。提前谢谢。

(到目前为止,这是我的代码,为了清晰起见)

private void connectedComponentLabelling(ImageProcessor ip) {

    int w = ip.getWidth();
    int h = ip.getHeight();
    int background = 255; //black
    int foreground = 0;   //white
    int nextLabel = 1;

    int [] linked;
    int [][] NEIGHBOUR = new int [w][h];

    for (int v=0; v<h; v++){
        for (int u=0; u<w; u++){
            if (ip.getPixel(v,u) != background){

                for (int j=-1; j<=1; j++){
                    for (int i=-1; i<=1; i++){

                        int p = ip.getPixel(v+j, u+i);

                        if (p != background){

                            //linked[nextLabel];
                            NEIGHBOUR[v][u] = nextLabel;

                    }else{
                     nextLabel++;
                    }



                }
            }
        }
    }
    }

1 个答案:

答案 0 :(得分:0)

一些提示:

  • 由于您是从左上角到右下角扫描像素,因此您应该仅比较您已扫描的像素。所以你应该只比较左上,上,右和左像素。

  • 然后,如果所有这些像素都是背景(这意味着您不知道连接此新像素的内容),则为此像素创建一个新标签:{{1} }

  • 另一方面,如果您发现其中一个像素不是背景,则将其标签分配给此像素。对于instace,如果您发现左上角的像素不是背景的一部分,那么您将其标签传播到当前像素:NEIGHBOUR[v][u] = nextLabel++

  • 执行此检查时,您可能还发现多个邻居的NEIGHBOUR[v][u] = NEIGHBOUR[v-1][u-1]值不同。例如。 NEIGHBOUR[v][u]。在这种情况下, 您将此信息添加到地图中,例如NEIGHBOUR[v-1][u-1]!=NEIGHBOUR[v-1][u+1]。但这值得一个新问题。