增强超像素连通性函数

来源:互联网 发布:js 中splice方法 编辑:程序博客网 时间:2024/05/22 17:12

增强超像素连通性函数:可以解决--在用SLIC或者mean-shift算法分割后会有连通性差和出现一些未被标记的小区域的问题。

function nlabels= EnforceLabelConnectivity(img_Lab, labels, K)



dx = [-1, 0, 1, 0];
dy = [0, -1, 0, 1];
[m_height, m_width, m_channel] = size(img_Lab);
[M, N] = size(labels);
nlabels = (-1)*ones(M, N);


label = 1;
adjlabel = 1;
xvec = zeros(m_height*m_width, 1);
yvec = zeros(m_height*m_width, 1);
m = 1;
n = 1;


for j = 1: m_height
    for k = 1: m_width
        %逐点寻找未标记的区域
        if (0>nlabels(m, n))
            %找到一个新区域后用label标记该区域的起点
            nlabels(m, n) = label;
            %开始一个新的分割 记录起点坐标
            xvec(1, 1) = k;
            yvec(1, 1) = j;
            %如果起点与某个已知区域相连 用adjlabel记录该区域编号 如果当前区域过小则与相邻区域合并
            for i = 1: 4
                x = xvec(1, 1)+dx(1, i);
                y = yvec(1, 1)+dy(1, i);
                if (x>0 && x<=m_width && y>0 && y<=m_height)
                    if (nlabels(y, x)>0)
                        adjlabel = nlabels(y, x);
                    end
                end
            end
            %逐点搜索当前区域的所有点 将当前区域的坐标存到xvec和yvec中 统计区域面积
            count = 2;
            c = 1;
            while (c<=count)
                for i = 1: 4
                    x = xvec(c, 1)+dx(1, i);
                    y = yvec(c, 1)+dy(1, i);
                    if (x>0 && x<=m_width && y>0 && y<=m_height)
                        if (0>nlabels(y, x) && labels(m, n)==labels(y, x))
                            xvec(count, 1) = x;
                            yvec(count, 1) = y;
                            nlabels(y, x) = label;
                            count = count+1;
                        end
                    end
                end
                c = c+1;
            end
            %过小的区域与相邻的区域合并
            if (count<600)
                for c = 1: (count-1)
                    nlabels(yvec(c, 1), xvec(c, 1)) = adjlabel;
                end
                %label编号要取消 改为上一个编号重新计数
                label = label-1;
            end
            %标签计数器自加
            label = label+1;
            %%%%%%%%%%%%%%
        end
        %主计数器自加
        n = n+1;
        if (n>m_width)
            n = 1;
            m = m+1;
        end
        %%%%%%%%%%%%
    end
end


end

原创粉丝点击