最近在用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