※ 引述《andgitisaac (AndGiTiSaaC)》之铭言:
: 请问各位前辈们
: 现在有个label矩阵
: L = [2 2 2 2 3;
: 2 3 2 3 3;
: 2 3 2 4 4;
: 2 2 2 4 4;
: 1 1 2 1 1];
: 但目前碰到的问题得把
: 即便是相同label
: 但没有连通的区域给分离(4连通)
: 也就是说L变成
: L = [2 2 2 2 3;
: 2 6 2 3 3;
: 2 6 2 4 4;
: 2 2 2 4 4;
: 1 1 2 5 5];
: 目前的作法是
: maxlabel = max(L(:))
: for n = 1:max(L(:))
: [bw, num] = bwlabel(L == n, 4)
: if num > 1
: for k = 2:num
: maxlabel = maxlabel + 1
: L(bw == k) = maxlabel
: end
: end
: end
: 但是由于label矩阵标签数非常多,200多组就要花快十秒
: 想请问前辈们有没有其他更好的做法
你的作法大概是 O(n^2),
所以理论上只要增加一个buffer,
写成 O(n) 的形式就能加速.
所以改成:
Total_num = 0;
Relabeled_L = zeros( size(L) );
for n=1:1:max( L(:) )
[bw_buffer, num] = bwlabel(L==n,4);
Relabeled_L( bw_buffer~0 ) = bw_buffer( bw_buffer~0 ) + Total_num;
%把bw_buffer得到的label,略过0的位置,平移前一个iteration的总label数
Total_num = Total_num + num;
%更新总label数
clear bw_buffer; clear num;
end