影象預處理。對二值圖進行形態學開操作,開操作能去掉細小的塊,平滑目標區域邊界且保持面積不變
遍歷二值圖矩陣,尋找目標區域且未被標記的點,若當前畫素未標記且當前位置畫素點為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 的功能,因為這篇文章針對需要了 解演算法的...