matlab練習程序(二值圖像連通區域標記法,一步法)

  這個只需要遍歷一次圖像就能夠完全標記了。我主要參考了WIKI這位兄弟的博客,這兩個把原理基本上該介紹的都介紹過了,我也不多說什麼了。一步法代碼相比兩步法真是清晰又好看,似乎真的比兩步法要好很多。

  代碼如下:

clear all;
close all;
clc;

img=imread('liantong.bmp');
imgn=img>128;
s=uint8(1-imgn);

 %{                     
s=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
   0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0;       %這個矩陣是維基百科中的矩陣
   0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 0;
   0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0;
   0 0 1 1 1 1 0 0 0 1 1 1 0 0 1 1 0;
   0 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 0;
   0 0 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0;
   0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0;
   0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
%}
imshow(mat2gray(s));
[m n]=size(s);
tmp=zeros(m,n);     %標記圖像
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];  %和當前像素座標相加得到八個鄰域座標

for i=2:m-1
    for j=2:n-1
        
        if s(i,j)==1 && tmp(i,j) ==0           
            tmp(i,j)=label;
            q{queue_tail}=[i j];        %用元組模擬隊列,當前座標入列
            queue_tail=queue_tail+1;
            
            while queue_head~=queue_tail
                pix=q{queue_head};                
                for k=1:8               %8鄰域搜索
                    pix1=pix+neighbour(k,:);
            if pix1(1)>=2 && pix1(1)<=m-1 && pix1(2) >=2 &&pix1(2)<=n-1   if s(pix1(1),pix1(2)) == 1 && tmp(pix1(1),pix1(2)) ==0 %如果當前像素鄰域像素爲1並且標記圖像的這個鄰域像素沒有被標記,那麼標記   tmp(pix1(1),pix1(2))=label;   q{queue_tail}=[pix1(1) pix1(2)];   queue_tail=queue_tail+1;   end
            end end queue_head=queue_head+1; end clear q; %清空隊列,爲新的標記做準備 label=label+1; queue_head=1; queue_tail=1; end end end figure,imshow(mat2gray(tmp))

下面是效果圖,就效果而言和上一篇沒什麼區別的。

原圖

效果圖

這兩篇算是把二值圖像連通標記給搞定了。

轉載於:https://www.cnblogs.com/tiandsp/archive/2012/12/06/2805276.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章