求連通域面積matlab

2021-09-26 15:46:34 字數 1454 閱讀 9909

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...