0

我正在尝试实现本文中描述的光速标记技术的代码(我不能使用图像处理工具箱):https ://pdfs.semanticscholar.org/ef31/7c257603004d818ca1e2a2aa67d36d40147e.pdf (参见第 2 节,第 7 页)。

这是我用于 LSL 等价构造的 Matlab 代码(算法 14,步骤 2)。

function [EQ,ERAi,nea] = LSL_equivalence(EQ,ERim1,RLCi,ERAim1,ERAi,NERi,nea,lImg)
    % LSL_EQUIVALENCE build the associative table between er and ea
    % GOAL: to create a Look Up Table to be applied to ERi to create EAi.

    for er = 1:2:NERi % check segments one by one
        % read the boundaries of each segment to obtain de relative labels of every agacent segment in the prev line
        j0 = RLCi(er); 
        j1 = RLCi(er+1);

        er0 = ERim1(j0+1); % label of the first segment
        er1 = ERim1(j1+1); % the label of the last segment

        % check label parity: segments are odd, background is even
        % bitand([1 2 3 4 5],1) == [1 0 1 0 1]
        if bitand(er0,1) == 0 % if er0 is even
            er0 = er0 + 1;
        end
        if bitand(er1,1) == 0 % if er1 is even
            er1 = er1 -1;
        end
        if er1 >= er0 % if there is an adjacency
            ea = ERAim1(er0+1); % absolute label of the first segment 
            a = EQ(ea+1);     % a is the ancestor (smallest label of the equivalence class) 
                for erk = (er0+2):2:er1
                    eak = ERAim1(erk+1);
                    ak = EQ(eak+1);
                    % min extraction and propagation
                    if a < ak
                        EQ(eak+1) = a;
                    else
                        a = ak;
                        EQ(ea+1) = a;
                        ea = eak;
                    end
                end
            ERAi(er+1) = a; % the global min of all ak ancestors 
        else % if there are no adjacent labels make a new label
            nea = nea + 1;
            ERAi(er+1) = nea;
        end
    end
    end

我在使用索引时遇到了一些问题,因为文章中描述的伪代码的索引以 0 开头,而 Matlab 使用 1。我已经在 Stack Overflow 这篇文章为连接的组件标签/Blob 提取实现 LSL 中找到了一些 C++ 代码(我应用了建议的更改)以及此 git repo https://github.com/prittt/YACCLAB/blob/master/include/labeling_lacassagne_2016_code.inc。我看不到差异。

另外,我在理解什么是等价类(这是矩阵 EQ 中的内容)时遇到了一些麻烦。提前谢谢!

4

1 回答 1

-2

我意识到这有点晚了,但我只是提出了一段类似于光速标记算法的代码。我将简要说明我是如何解决索引问题的。

LSL 的第一步是获取每一列像素并找到连续标记像素的开始和停止位置。你可以在 Matlab 中这样做:

I = imread('text.png');
[rows,cols] = find(xor(I(2:end,:),I(1:end-1,:)));

这给你的是一列中每个像素运行的开始和停止位置的行和列,除了它的非包含索引。通过非包含索引,我的意思是每个像素运行 (n) 的像素索引从I(r(2*n-1),c(2*n-1))I(r(2*n)-1,c(2*n))。您应该注意,本文沿行运行,上面的代码沿列运行,但同样的原则也适用。您还应该注意,上述代码并未涵盖图像边缘标记像素的情况。

如果您想查看完整的实现,我在 Matlab File Exchange 上发布了我的代码。我并没有声称它完全复制了 LSL,但它在许多相同的原则上工作。

https://www.mathworks.com/matlabcentral/fileexchange/70323-ftllabel?s_tid=prof_contriblnk

于 2019-03-07T17:05:36.810 回答