【语言转换】matlab bwlabeln 方法idl实现

本文介绍了一种使用IDL语言实现MATLAB中bwlabeln方法的过程,该方法主要用于图像处理中的区域分割任务。通过详细解析代码逻辑及步骤,实现了与MATLAB相同的功能,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

matlab bwlabeln方法是用于区域分割,就是相同且连续的值赋同样的值。这个方法的实现参考了帮助文档,c算法的书,主要是网络上关于此方法的c++实现,

链接如下:http://www.cnblogs.com/waring/p/4233705.html

真是谢谢博主,但此代码中有很多修改的地方,在idl实现中都改过来了,实现效果和matlab,mode参数为8的一毛一样~~哈啊哈

具体代码如下,其中涉及的函数分块依次向下,每一部分都有测试用例,可以改成pro过程进行单独运行。

FUNCTION bwlabeln, data, mode

;data=[[0,2,0,0,4],[0,0,3,0,0],[4,0,0,4,4],[0,2,0,0,0]]

;data=[10,0,3,4,300,6,7,8,9,10]
;num=[1]
;mode=8

data=transpose(data)
num_runs = 0
num_runs = number_of_runs(data)
sc = intarr(num_runs)
ec = intarr(num_runs)
r = intarr(num_runs)
labels = intarr(num_runs)
;memset(labels, 0, sizeof(int)*num_runs);清空数组
tmp=fill_run_vectors(data, sc, ec, r)
tmp=first_pass(sc, ec, r, labels, num_runs, mode)
result=data*0;cv::Mat result = cv::Mat::zeros(in.size(), CV_8UC1)
number = 0

for i = 0, num_runs-1 do begin
  for j = sc[i], ec[i] do begin
    result[j,r[i]] = labels[i]
    ;if number lt labels[i] then begin
    ;number = labels[i]
    ;endif
  endfor
endfor
;if n_elements(num) ge 1 then begin
;  num = number
;endif

result=transpose(result)
;print,result
;return result;

RETURN,result
END

Function number_of_runs,data
;data=[[0,2,0,0,4],[0,0,3,0,0],[4,0,0,4,4]]
 ;data=[10,0,3,4,300,6,7,8,9,10]
 ;data=[1, 1, 0, 0, 0, 1, 1, 1, 0, 0]
 ;data=[[2,2],[3,3],[4,4]]
  ;clurow=size(data,/N_DIMENSIONS)
  ;print,size(data,/N_DIMENSIONS)
  cols=n_elements(data[*,0])
  rows = n_elements(data[0,*])
  
  ;cols=size(data,/N_DIMENSIONS)
  ;rows=n_elements(data)/cols

;print,data[*,0]
;print,data[0,1]

result = 0
    for row = 0, rows-1 do begin
      p_row=byte(data[*,row]);const uchar * p_row = in.ptr<uchar>(row);
      ;print,data[*,row],"row=",row
      ;print,p_row,"row=",row
      ;*p_row=data[row]
      if p_row[0] ne 0 then begin
        result++
      endif
      for clu=1, cols-1  do begin
        if p_row[clu] ne 0 && p_row[clu-1] eq 0 then begin
          result++
        endif
      endfor
    endfor
  ;print,result;非零像素团个数
return,result

END

FUNCTION fill_run_vectors,data,sc,ec,r
;data=[10,0,3,4,300,6,7,8,9,10]
;data=[[0,2,0,0,4],[0,0,3,0,0],[4,0,0,4,4]]
;num_runs=5
;sc = intarr(num_runs)
;ec = intarr(num_runs)
;r = intarr(num_runs)

 cols=n_elements(data[*,0])
 rows = n_elements(data[0,*])
  
idx = 0
for row = 0,rows-1 do begin
  p_row=byte(data[*,row]);const uchar * p_row = in.ptr<uchar>(row);
  prev = 0
  for clu = 0, cols-1 do begin
    if p_row[clu] ne 0 && prev eq 0 then begin
        sc[idx] = clu
        r[idx] = row
        prev = 1
    endif
    if p_row[clu] eq 0 && prev eq 1 then begin
      ec[idx++] = clu - 1
      prev = 0
    endif
    if clu eq cols-1 && prev eq 1 then begin
      ec[idx++] = clu
    endif
  endfor
endfor
;print,sc
;print,ec
;print,r
return,0
END

FUNCTION first_pass,sc, ec, r, labels, num_runs, mode

;data=[[0,2,0,0,4],[0,0,3,0,0],[4,0,0,4,4]]
;data=transpose(data)
;num_runs=5
;sc=[1,4,2,0,3]
;ec=[1,4,2,0,4]
;r=[0,0,1,2,2]
;labels = intarr(num_runs)
;mode=8


cur_row = 0
next_label = 1
first_run_on_prev_row = -1
last_run_on_prev_row = -1
first_run_on_this_row = 0
offset = 0
equal_i = INTARR(num_runs)
equal_j = INTARR(num_runs)
equal_idx = 0
if mode eq 8 then begin
  offset = 1
endif

for k = 0, num_runs-1 do begin
  if r[k] eq cur_row + 1 then begin
    cur_row += 1
    first_run_on_prev_row = first_run_on_this_row
    first_run_on_this_row = k
    last_run_on_prev_row = k - 1
  endif else if r[k] gt cur_row + 1 then begin
    first_run_on_prev_row = -1
    last_run_on_prev_row = -1
    first_run_on_this_row = k
    cur_row = r[k];
  endif
  if first_run_on_prev_row ge 0 then begin
    p = first_run_on_prev_row
    while p le last_run_on_prev_row && sc[p] le (ec[k] + offset) do begin
      if sc[k] le ec[p] + offset then begin
        if labels[k] eq 0 then begin
          labels[k] = labels[p]
        endif else if labels[k] ne labels[p] then begin
          ;labels[p] = labels[k];
          equal_i[equal_idx] = labels[k]
          equal_j[equal_idx] = labels[p]
          equal_idx += 1
        endif
      p += 1
      endif
    endwhile
  endif  
  if labels[k] eq 0 then begin
    labels[k] = next_label++
  endif
endfor
;;;;;;;;;;;process labels;将当中相同族的不同标签合并到一起


for i = 0, equal_idx -1 do begin
  if equal_i[i] gt equal_j[i] then begin
    max_label =equal_i[i]
  endif else begin
    max_label =equal_j[i]
  endelse
  if equal_i[i] lt equal_j[i] then begin
    max_label =equal_i[i]
  endif else begin
    max_label =equal_j[i]
  endelse
  for j = 0, num_runs-1 do begin
    if labels[j] eq max_label then begin
      labels[j] = min_label
    endif
  endfor
endfor

;;;;;;;;;;;;process ignore labels;标签映射到一个连续的空间

hist = intarr(next_label)
non_labels = intarr(next_label)
;memset(hist, 0, sizeof(int)*next_label);
non_num = 0

for i = 0, num_runs-1 do begin
  hist[labels[i]]++
endfor

for i = 1, next_label-1 do begin
  if hist[i] eq 0 then begin
    non_labels[non_num++] = i
  endif
endfor

for j = 0, num_runs-1 do begin
  k = labels[j]
  for i = non_num-1,0,-1 do begin
    if k gt non_labels[i] then begin
      labels[j] -= (i+1)
      break
    endif
  endfor
endfor


;print,labels

return,0

END


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值