Re: [討論] label矩陣

作者: YoursEver (豬是妳)   2016-09-20 10:45:06
※ 引述《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
作者: YoursEver (豬是妳)   2016-09-20 10:58:00
回了才發現和前一篇sunev老大的寫法是一樣的.
作者: sunev (Veritas)   2016-09-24 02:16:00
但是原PO說變慢了,可能先profile分析一下瓶項在哪裡
作者: andgitisaac (AndGiTiSaaC)   2016-09-27 20:18:00
首先先感謝大大的解釋,很抱歉最近沒有回版上看到前輩的後續發文。同時也相當感謝sunev大大在第一時間回覆我的疑問。當初在看了大大的buffer解釋後,也覺得變慢很奇怪事情忙完後重新跑了一次程式,卻發現時間確實有加快由於當初沒有做更深的研究因此沒多加注意過幾天要再來實測高解析度的影像。相信是我一時不察所發生的錯誤,也再次感謝兩位前輩的協助。謝謝!
作者: sunev (Veritas)   2016-09-28 11:41:00
如果瓶頸是bwlabel,num都不大,這種改寫不會改善太多但變慢應該是不至於。

Links booklink

Contact Us: admin [ a t ] ucptt.com