天天看點

MATLAB中圖像連通域操作

最近在用MATLAB做一個圖像處理算法的仿真,其中涉及到了連通域的操作,因為平時對C++比較熟悉,對matlab語言不熟悉,折騰了好久,算是做一個記載吧。

1、bwareaopen函數

*用法:

img = bwareaopen(img,set_noise);   
%% 作用:對img圖像做連通域操作,去除那些像素資料小于set_noise數目的連通域塊,将其全部置為0。
%% set_noise參數: 設定需要去除的連通域的像素數目的門檻值
%% 傳回的是二值圖像,圖像中是連通域的部分都被置為1,其餘的都是0
           

注意幾點:

1、連通域操作,操作的連通域的是白色部分,如果需要處理的圖中需要做連通域的部分是黑色的,就需要做一個灰色反轉。

灰階反轉

1、如果是灰階圖像: img = 255 - img;

2、如果是二值圖像: img = 1 - img;

2、bwlabel和regionprops函數

函數功能:

bwlabel函數 – 對連通域進行操作,标記

regionprops函數 – 統計連通域辨別圖像的連通域面積分布

%% 實作功能: 對二值圖像做連通域操作,找到最大連通域區域的下标,将相應的連通域去掉(置0)
%% 代碼:
 L = bwlabel(img2);   % 對連通區域進行标記 
 %% 這一步之後,一個連通域會被相同的數字辨別,數字最大值就是連通域的個數 。不同的正整數元素對應不同的區域,例如:L中等于整數1的元素對應區域1;L中等于整數2的元素對應區域2;以此類推。
 stats = regionprops(L);  
 %% 統計上一步标記圖像中的連通域的面積分布
 Ar = cat(, stats.Area);  
 ind = find(Ar ==max(Ar));%找到最大連通區域的标号  
 img2(find(L==ind))=;%将其區域置為  
           

3、自己代碼工程

clear all;
% 路徑
SamplePath1 =  'image\';  %存儲圖像的路徑
savepath = 'image11\';        %
fileExt = '*.jpg';  %待讀取圖像的字尾名
%擷取所有路徑
files = dir(fullfile(SamplePath1,fileExt)); 
len1 = size(files,);
%周遊路徑下每一幅圖像
for i=:len1;
   fileName = strcat(SamplePath1,files(i).name); 
   image = imread(fileName);
   image = rgb2gray(image);  %灰階化

   %調用自己分割函數
   img2 = segmentation(image,,'pso');
   img2 =  - img2;     %灰階反轉
   %連通域去掉小區域
   set_noise=;
   % 去除
   img2=bwareaopen(img2,set_noise);

   %去除最大的連通域
   L = bwlabel(img2);% 對連通區域進行标記  
   stats = regionprops(L);  
   Ar = cat(, stats.Area);  
   ind = find(Ar ==max(Ar));%找到最大連通區域的标号  
   img2(find(L==ind))=;%将其區域置為0 

    %灰階反轉回來
   img2 =  - img2;

   fileName2 = strcat(savepath,files(i).name); 
   imwrite(img2, fileName2);
end
           

繼續閱讀