matlab有自帶函式bwreopen()求連通域,並移除小面積連通域,返回乙個mask模板不同連通域用不同的label標誌,背景用0標誌。
function [ mask ] = bwareopenlz( lig,minarea)
%untitled3 此處顯示有關此函式的摘要
% 此處顯示詳細說明
row=size(lig,1);
col=size(lig,2);
mask=zeros(row,col); %標記影象
label=1;
queue_head=1; %佇列頭
queue_tail=1; %佇列尾
neighbour=[-1 -1;-1 0;-1 1;0 -1;0 1;1 -1;1 0;1 1]; %和當前畫素座標相加得到八個鄰域座標
q2=zeros(row*col,2);%存放座標位置
for i=2:row-1
for j=2:col-1
if lig(i,j)==1 && mask(i,j) ==0
mask(i,j)=label;
q2(queue_tail,:)=[i j];
%q=[i j]; %用元組模擬佇列,當前座標入列
queue_tail=queue_tail+1;
while queue_head~=queue_tail
%pix=q;
pix2=q2(queue_head,:); %pix2是座標:(x,y)
for k=1:8 %8鄰域搜尋
%pix1=pix+neighbour(k,:);
pix1=pix2+neighbour(k,:); %鄰域座標
if pix1(1)>=2 && pix1(1)<=row-1 && pix1(2) >=2 &&pix1(2)<=col-1
if lig(pix1(1),pix1(2)) == 1 && mask(pix1(1),pix1(2)) ==0 %如果當前畫素鄰域畫素為1並且標記影象的這個鄰域畫素沒有被標記,那麼標記
mask(pix1(1),pix1(2))=label;
%q=[pix1(1) pix1(2)];
q2(queue_tail,:)=[pix1(1) pix1(2)];
queue_tail=queue_tail+1;
endend
end
queue_head=queue_head+1; %從頭遍歷到佇列尾部,即遍歷8鄰域畫素的8鄰域畫素
end %此時結束乙個連通域的搜尋
%統計該連通域的畫素數,小於閾值的連通域進行去除
area=queue_head-1;
if(area
matlab去除大面積連通區域
在利用進行影象形態學處理的時候,經常需要去除面積較大或面積較小的連通區域。對於去除面積較小的連通區域,matlab提供了現有的函式 bw2 bwareaopen bw,p,conn 刪除二值影象bw中面積小於p的物件,預設情況下conn使用8鄰域可是matlab並沒有去除面積較大連通區域的函式,當然...
求矩陣連通域的個數
實際上是個寶石迷陣消除遊戲的簡化版,把不同顏色的寶石看成不同值的數字,然後連通超過三個的可以消除。這裡沒有加入消除後降落的機制,一定程度上簡化了問題的複雜度。那種需要每次消除後都從頭遍歷 using namespace std template t val t matrix,int w,int h,...
Matlab中處理連通域的函式家族
我們在進行影象處理的時候經常會遇到對連通區域的一些操作,比如計算連通域面積 對連通域計數等,對於這類問題很多人會沒有思路不知所措,好在matlab工具箱給提供了這些基本的函式,實在是方便了不少啊!如果想知道演算法原理,只需要檢視響應函式的源 即可。廢話不多說,讓我們一一來看這些常用的函式吧 1 ma...