为连接的组件标记/斑点提取实施LSL [英] Implementing LSL for Connected Component Labeling/Blob Extraction

查看:113
本文介绍了为连接的组件标记/斑点提取实施LSL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试通过 https:// www实施光速标记算法。 lri.fr/~lacas/Publications/JRTIP10.pdf 。我试图尽可能地遵循本文所述的算法方法(第9-12页),但是在等效阶段之后的输出没有意义。

I am trying to implement the Light Speed Labeling algorithm from https://www.lri.fr/~lacas/Publications/JRTIP10.pdf. I tried to follow the algorithmic approach described in the paper as closely as possible (pgs 9-12) but the output doesn't make sense after the equivalence stage.

任何人都知道问题出在哪里?

Anyone have any idea what the problem is?

void segment(const unsigned * Xi, const unsigned& N, unsigned * ERi, unsigned *RLCi, unsigned& ner) 
{ 
unsigned x1     = 0;
unsigned f      = 0;
unsigned er     = 0;    

for (unsigned j = 0; j < N; ++j)
{
    const unsigned x0 = Xi[j];
    f = x0 ^ x1;
    RLCi[er] = j;         
    er = er + f;
    ERi[j] = er;         
    x1 = x0;        
}    
if (x1 != 0)
{
    RLCi[er] = N;
}
er = er + x1;
ner = er;
}

void equivalance(const unsigned& ner, unsigned * RLCi, unsigned * EQ, unsigned * ER0, unsigned * ERA0, unsigned * ERA1, unsigned& nea, const unsigned& N = 0)
{
for (unsigned er = 1; er <= ner; er += 2)
{        
    int j0 = RLCi[er - 1];
    int j1 = RLCi[er] - 1;
   // Unnecessary given optimization and need for 4-connectivity:
    // if (j0 > 0) j0 = j0 - 1;
   // if (j1 < N - 1) j1 = j1 + 1;

    int er0 = ER0[j0];
    int er1 = ER0[j1];

    if (!(er0 & 1)) er0 = er0 + 1;
    if (!(er1 & 1)) er1 = er1 - 1;       

    if (er1 >= er0) // adjacent label
    {            
        unsigned ea = ERA0[er0];
        unsigned a = EQ[ea];
        for (unsigned erk = er0 + 2; erk <= er1; ++erk)
        {
            unsigned eak = ERA0[erk];              
            unsigned ak = EQ[eak];
            if (a < ak)
            {
                EQ[eak] = a;
            }
            else
            {
                a = ak;                    
                EQ[ea] = a;
                ea = eak;
            }                
        }           
        ERA1[er] = a;
    }
    else
    {
        nea = nea + 1;
        ERA1[er] = nea;
    }
}   
}

typedef std::vector<unsigned> value_type;
void bwlabel(const double* X, unsigned * EA, const unsigned& N, const unsigned& M)
{
unsigned nea = 0;
const unsigned size = N * M;

value_type EQ(size, 0), ER(size, 0), ERA(size, 0), A(size, 0), RLC(M * (2 * N), 0), IN(X, X + size), NER(M, 0);

// Step 1
for (int m = 0; m < M; ++m)
{        
    segment(&IN[0] + N * m, N, &ER[0] + N * m, &RLC[0] + m * (2 * N), NER[m]);       
}    
// Step 2
for (int m = 1; m < M; ++m)
{        
    equivalance(NER[m], &RLC[0] + m * (2 * N), &EQ[0], &ER[0] + (m - 1) * N, &ERA[0] + (m - 1) * N, &ERA[0] + m * N, nea, N);               
}
// Step 3
for (int j = 0; j < size; ++j)
{
    EA[j] = ERA[ER[j]];        
} 

// Step 4
unsigned na = 0;
for (int e = 0; e < size; ++e)
{
    if (EQ[e] != e)
    {
        A[e] = EQ[EQ[e]];
    }
    else
    {
        na = na + 1;
        A[e] = na;
    }
}
// Step 5
for (int j = 0; j < size; ++j)
{
    EA[j] = A[EA[j]];
}
}
IN=
1 1 0 1 1 0 0 1 1 1 
0 1 1 0 1 0 0 1 1 1 
1 0 1 1 1 1 1 0 1 0 
1 0 0 0 0 1 1 0 1 0 
0 0 1 1 0 0 0 1 1 1 
0 1 1 0 0 0 1 0 1 0 
1 0 1 1 1 1 1 0 0 0 
1 0 1 0 1 0 0 0 1 0 
0 1 1 1 1 0 1 1 0 1 
0 0 1 1 1 0 1 0 0 0 


RLC=
[0]0 [1]2 [2]3 [3]5 [4]7 [5]10 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]0 [2]0 [3]0 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 
[0]1 [1]3 [2]4 [3]5 [4]7 [5]10 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]0 [2]0 [3]0 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]1 [2]2 [3]7 [4]8 [5]9 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]0 [2]0 [3]0 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]1 [2]5 [3]7 [4]8 [5]9 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]0 [2]0 [3]0 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 
[0]2 [1]4 [2]7 [3]10 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 
[0]0 [1]0 [2]0 [3]0 [4]0 [5]0 [6]0 [7]0 [8]0 [9]0 


ER=
1 1 2 3 3 4 4 5 5 5 
0 1 1 2 3 4 4 5 5 5 
1 2 3 3 3 3 3 4 5 6 
1 2 2 2 2 3 3 4 5 6 
0 0 1 1 2 2 2 3 3 3 
0 1 1 2 2 2 3 4 5 6 
1 2 3 3 3 3 3 4 4 4 
1 2 3 4 5 6 6 6 7 8 
0 1 1 1 1 2 3 3 4 5 
0 0 1 1 1 2 3 4 4 4 


ERA=
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 1 0 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 3 0 0 
0 0 0 4 0 5 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 


EQ=
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 


EA=
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 


推荐答案

对于初学者来说,您省略了右边框补偿变量 b 。这会影响RLC的结果。

For starters, you have omitted the right border compensation variable b. This affects the results of RLC.

您正在获得(第一行):

You are obtaining (for the first row):

[0]0 [1]2 [2]3 [3]5 [4]7 [5]10 [6]0 [7]0 [8]0 [9]0

何时应获得:

[0]0 [1]1 [2]3 [3]4 [4]7 [5]10 [6]0 [7]0 [8]0 [9]0

谢谢。

这篇关于为连接的组件标记/斑点提取实施LSL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆