Matlab實現bwlabel函式(區域標記)功能

2022-06-19 01:18:08 字數 3045 閱讀 4048

影象預處理。對二值圖進行形態學開操作,開操作能去掉細小的塊,平滑目標區域邊界且保持面積不變

遍歷二值圖矩陣,尋找目標區域且未被標記的點,若當前畫素未標記且當前位置畫素點為1(二值圖的目標區域)

將該目標點入隊,並標上區域編號label

bfs,對步驟1中的求得8鄰域的畫素點,如果該點未越界,是目標點(灰度值為1)並且未被標記過則入隊,並且標上當前編號label,佇列中每個點的8領域判斷完則出隊,當隊列為空時乙個連通區域標記完成,label+1

回到步驟1,直到二值圖遍歷完成

輸出,將標記矩陣以彩色標記的形式輸出,迴圈結束時label的值多加了1,退出迴圈時,label的值減1才是該圖中的連通區域的個數

function [conn,num] = mybwlabel( i )

% 使用bfs對二值圖區域標記

% 輸入:i是二值圖矩陣

% 輸出:tmp是標記矩陣,num是連通區域個數

[m n] = 計算二值圖的大小

conn = 開闢乙個和二值圖同樣大小的標記矩陣

label = 給區域編號設初值1

queue = 定義二維陣列用於存放乙個連通區域的點的座標(模擬佇列)

neighbour = 8鄰域(座標無序)

遍歷二值圖

如果當前點屬於目標區域且未標記

queue = 當前點座標入隊

conn(i,j) = 給該點賦值區域編號

佇列不空

index = 取出隊首座標

8鄰域搜尋

cur_index = 當前點鄰域座標

如果當前座標未越界

如果當前畫素鄰域畫素為1並且標記影象的這個鄰域畫素沒有被標記

標記當前點

當前座標入隊(矩陣合併)

隊首座標出

label = 區域編號加1

num = 連通區域的個數為label-1

end

function [conn,num] = mybwlabel( i )

% 對二值圖區域標記

% 輸入:i是二值圖矩陣

% 輸出:tmp是標記矩陣,num是連通區域個數

[m n] = size(i);

conn = zeros(m,n); %標記矩陣

label = 1;

queue = ; %用二維陣列模擬佇列

%和當前畫素座標相加得到八個鄰域座標(座標無序)

neighbour = [-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1];

for i = 2 : m-1

for j = 2 : n-1

if i(i,j) == 1 && conn(i,j) == 0 %屬於目標區域且未標記才處理

conn(i,j) = label;

queue = [i;j]; %記錄當前點座標

while ~isempty(queue) %佇列不空,這裡沒有出隊操作,佇列中的每乙個元素的8領域都判斷一遍

index = [queue(1,1),queue(2,1)];

for k = 1 : 8 %8鄰域搜尋

cur_index = index + neighbour(k,:); %加上每一行的座標得到周圍8鄰域的座標點

if cur_index(1) >= 2 && cur_index(1) <= m - 1 && cur_index(2) >= 2 && cur_index(2) <= n - 1 %防止座標越界

if i(cur_index(1),cur_index(2)) == 1 && conn(cur_index(1),cur_index(2)) ==0 %如果當前畫素鄰域畫素為1並且標記影象的這個鄰域畫素沒有被標記,那麼標記

conn(cur_index(1),cur_index(2)) = label;

queue = [queue [cur_index(1);cur_index(2)]];

end

end

endqueue(:,1) = ; %佇列中第一列的座標出隊

end

label = label+1;

endend

endnum = label - 1; %連通區域的個數(減去背景這個連通區域)

end

% 呼叫示例:

i = imread('rice.png');

ib = im2bw(i);

[b,num] = mybwlabel(ib);

subplot(1,3,1),imshow(i),title('原圖');

subplot(1,3,2),imshow(ib),title('二值圖');

subplot(1,3,3),imshow(label2rgb(b)),title('區域標記');

連通區域個數:

影象預處理去噪,由上圖中二值化之後,二值圖中有很多雜訊點,可以通過形態學開操作去除這些點

se = strel('disk',3);  %定義乙個圓形結構元

ib = imopen(ib,se); %開操作去除雜訊

開操作之後的效果

連通區域個數:

開操作之後去除雜訊,連通區域個數明顯減少

Matlab中bwlabel函式的使用

l bwlabel bw,n 功能概述 返回乙個和bw大小相同的l矩陣,包含了標記了bw中每個連通區域的類別標籤,這些標籤的值為1 2 num 連通區域的個數 n的值為4或8,表示是按4連通尋找區域,還是8連通尋找,預設為8。用法 l bwlabel bw l bwlabel bw,n l,num ...

matlab找連通區域的bwlabel函式的使用

用法 l bwlabel bw,n 返回乙個和bw大小相同的l矩陣,包含了標記了bw中每個連通區域的類別標籤,這些標籤的值為1 2 num 連通區域的個數 n的值為4或8,表示是按4連通尋找區域,還是8連通尋找,預設為8。4連通或8連通是影象處理裡的基本感念 而8連通,是說乙個畫素,如果和其他畫素在...

bwlabel演算法 BWLABEL的演算法

的函式 使得最後我也參加了討論。當時我說了一句錯 話 大概 ipt中的 bwlabel 也使用廣度優先的演算法吧。其實bwlabel 用的並不是圖的廣度 優先遍歷。它用的演算法正是本系列文章 討論的內容。雖然是本系列的第一篇,但我不打算介紹 bwlabel 的功能,因為這篇文章針對需要了 解演算法的...