【水果識別分類】基於matlab形態學水果識別分類【含Matlab原始碼 1132期】
一、簡介
1 概述 1.1 基本思想 用具有一定形態的結構元素去度量和提取影象中的對應形狀,以達到對影象分析和識別的目的
1.2 基本運算 膨脹、腐蝕、開操作、閉操作
1.3 數學基礎
集合論
結構元素:
原始影象需要擴充使得結構元素位於原始影象邊緣時擴充部分可以涵蓋整個結構元素。
2 二值影象形態學基本操作
2.1 腐蝕操作
結構元素B全部位於A中對應的位移量z,故會削弱邊界
效果:
是一種收縮或細化的操作。
2.1 膨脹操作
結構元素B與A有交集對應的位移量z,故會擴張邊界
效果:
是一種增長或粗化的操作。
注:腐蝕和膨脹是對偶的(即對前景腐蝕後求反=對背景膨脹的結果)
2.3 開操作
先腐蝕後膨脹,平滑物體的輪廓,斷開較窄的連線條、消除細的突出物
2.4 閉操作
先膨脹後腐蝕,同樣能平滑物體的輪廓,但會彌合較窄的間斷和細長條
效果:向外的角保持不變,向內的角變圓了,填補間斷—“加”
2.5 開操作和閉操作的比較
2.5.1 對偶性(閉操作後取反結果=對背景開操作)
2.5.2 性質
運算元應用一次後,再用則無變化
2.5.3 對比效果
2.5.4 應用
開操作取出影象中的小目標(去噪)
閉操作連線目標(消除細小間隔)
2.6 擊中擊不中變換
目的:形狀檢測(檢測某種特定形狀的位置,要求每個物體至少被一個畫素寬的背景所圍繞)
將前景和背景一起匹配
3 二值影象形態學演算法
3.1 邊界提取
前景-被腐蝕的前景
3.2 孔洞填充
找一個起始點(位於孔洞中),不停膨脹後並上A反,直到不再發生變化
3.3 聯通分量的提取
通過上述迭代公式可以從聯通圖案的一個已知點得到整個聯通圖案
3.4 凸殼
凸:集合A內連線任意兩個點的連線都在A內,則稱集合A是凸的
凸殼:任意集合S的凸殼H是包含於S的最小凸集
其中X0為A,Bi是不同方位的結構元素,一個Bi能夠做出一個Di,A的凸殼為所有的Di相交
結果:
3.5 細化
A減去A與結構元B做擊中擊不中變換匹配到的那部分畫素
其中B為結構元序列
步驟:
A被B1~Bn按次序細化,再返回B1,從B1開始按次序細化,直到收斂
3.6 粗化
細化的形態學對偶
A並上A與結構元B做擊中擊不中變換匹配到的那部分畫素的和
3.7 骨架
A的骨架可用腐蝕和開操作表達
其中k代表對A進行k次腐蝕,而K則是A被腐蝕為空集前最後一次迭代
3.8 剪裁
是對細化處理和骨架繪製演算法的補充,因為這些處理會將附加部分保留下來,應清楚乾淨,則需要剪裁來取出寄生的多餘部分
4 灰度級形態學
4.1 操作
腐蝕:輸出影象變暗,亮的細節被減少
膨脹:輸出影象變亮,暗的細節被減少
4.2 效果
開操作:去除較小的明亮細節
閉操作:去除較小的暗細節
4.3 演算法 影象平滑:先開(抑制亮細節)後閉(抑制暗細節) 形態學梯度:膨脹-腐蝕 頂帽變換:校正不均勻光照,增強陰影的細節
二、原始碼
```c clear;clc;close all; %%%%%%%%%%%%%%%%% 讀取原圖,並處理成二值影象 %%%%%%%%%%%%%%%%%%%%%%% %I=imread('梨2.jpg'); %I=imread('桃子2.jpg'); %I=imread('蘋果2.jpg'); %I=imread('香蕉.jpg'); %I=imread('青椒.jpg'); I=imread('test4.jpg');
I2=rgb2gray(I); BW=im2bw(I2,0.9); figure(1),subplot(1,3,1),imshow(I),title('原始影象'); subplot(1,3,2),imshow(I2),title('灰度影象'); subplot(1,3,3),imshow(BW),title('二值影象');
%%%%%%%%%%%%%%%% 進行邊緣檢測 得到不連續的圖形邊界 %%%%%%%%%%%%%%%%%%%%%% %得到各個圖形的連續邊界 SE=strel('rectangle',[40 30]); % 結構定義 J2=imopen(BW,SE); % 開啟運算 figure(2),imshow(J2),title('對二值影象進行開運算');
SE=strel('square',5); % 採用方形結構元素進行腐蝕 J=imerode(~J2,SE); BW2=(~J2)-J; % 檢測邊緣 figure(3),imshow(BW2),title('邊緣檢測');
%填充了已有的檢測的連續形狀邊界 B = imfill(BW2,'holes');%影象填充 B = bwmorph(B,'remove');%移除內部畫素 figure(4),imshow(B),title('提取出的邊界影象');
%將不同的圖形進行分別標記,num表示連線的圖形物件的個數 [Label,num] = bwlabel(B,8);
%%%%%%%%%%%%%%%%%%%計算各個圖形單元邊界畫素點數%%%%%%%%%%%%%%%%%%%%%%%%%%% for i = 1 : num Premeter(i) = 0; end
[row,col] = size(Label);
for i = 1 : row
for j = 1 : col
if(Label(i,j) > 0)
Premeter(Label(i,j)) = Premeter(Label(i,j)) + 1;%計算標記後的各塊圖形邊界中畫素的個數的總數
end
end
end
%%%%%%%%%%%%%%%%%%% 計算各個圖形單元的面積%%%%%%%%%%%%%%%%%%%%%%%%%%%%% FilledLabel = imfill(Label,'holes'); %填充標記過的邊界線中間圍成的圖形區域 figure,imshow(FilledLabel),title('標記過並被填充的結果'); for i = 1 : num Area(i) = 0; end
[row,col] = size(FilledLabel); for i = 1 : row for j = 1 : col if(FilledLabel(i,j) > 0) Area(FilledLabel(i,j)) = Area(FilledLabel(i,j)) + 1; %通過統計畫素點個數的方式來求各形狀的面積 end end end
%%%%%%%%%%%%%%%%%% 計算各個圖形單元的圓度 %%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1 : num
Ecllipseratio(i) = 4piArea(i)/Premeter(i)^2;
end
%%%%%%%%%%%%%%%%%%%% 計算各個影象的色度 %%%%%%%%%%%%%%%%%%%%%
HSV = rgb2hsv(I); %轉換為HSV,為後面的色度元素的提取做準備
[row,col] = size(FilledLabel); %統計填充後的圖形中各塊圖形所含畫素的個數的多少 MeanHue = zeros(1,num); for i = 1 : num Hue = zeros(Area(i),1); nPoint = 0; for j = 1 : row for k = 1 : col if(FilledLabel(j,k) == i) nPoint = nPoint + 1; Hue(nPoint,1) = HSV(j,k,1); end end end
Hue(:,i) = sort(Hue(:,1));
for j = floor(nPoint*0.1) : floor(nPoint*0.9)
MeanHue(i) = MeanHue(i) + Hue(j,1);
end
MeanHue(i) = MeanHue(i) / (0.8*nPoint); %計算出平均的色度值
end
%%%%%%%%%%%%%%%%%%%%%%%% 各種水果識別 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%識別梨,在二維特徵空間對各個影象進行類別區分 pear=0;result1=0; for i=1:num if(MeanHue(i)<0.125) %判斷各個圖形中平均色度值小於0.125的為梨 pear=i; result1=1; end end %對分出來的梨構建相應的影象掩膜,並用對原圖的亮度影象進行掩膜操作 pearHSV=HSV; for j = 1 : row for k = 1 : col if(FilledLabel(j,k) ~=pear) pearHSV(j,k,3)=0; end end end %變換生成最終的結果影象 pearmatrix = hsv2rgb(pearHSV);%轉換為RGB彩圖,彩圖中已經濾去了其餘水果,只剩下梨 if(result1==1) figure,imshow(pearmatrix);title('這是梨'); end
%%%%%%%%%識別桃,在二維特徵空間對各個影象進行類別區分 pitch=0;result2=0; for i=1:num if(MeanHue(i)>0.5) %判斷各個圖形中平均色度值大於0.5的為桃 pitch=i; result2=1; end end ```
三、執行結果
四、備註
版本:2014a
- 【路徑規劃】基於matlab GUI改進的DWA演算法機器人靜態避障路徑規劃【含Matlab原始碼 678期】
- 【目標檢測】基於matlab GUI差分法運動目標檢測【含Matlab原始碼 1284期】
- 【交通預測】基於matlab GUI交通預測四階段法交通分配【含Matlab原始碼 1140期】
- 【路徑規劃】基於matalb遺傳演算法機器人柵格地圖路徑規劃【含Matlab原始碼 022期】
- 【路徑規劃】基於matlab改進的人工勢場演算法機器人避障路徑規劃【含Matlab原始碼 1151期】
- 【飛行器】基於matlab多源資訊融合演算法多旋翼無人機組合導航系統【含Matlab原始碼 1267期】
- 【無人機】基於matlab無人機追蹤軌跡【含Matlab原始碼 1152期】
- 【影象加密】基於matlab混沌演算法影象加密解密【含Matlab原始碼 1218期】
- 【影象檢測】基於matlab GUI比值 歸一化 相關係數遙感影象【含Matlab原始碼 737期】
- 【影象加密】基於matlab混沌系統圖像加密【含Matlab原始碼 1190期】
- 【影象分類】基於matlab極限學習分類器對遙感影象分類【含Matlab原始碼 150期】
- 【影象增強】基於matlab GUI暗通道影象去霧【含Matlab原始碼 740期】
- 【優化求解】基於matlab差分進化演算法求解函式極值問題【含Matlab原始碼 1199期】
- 【身份證識別】基於matlab GUI身份證號碼識別【含Matlab原始碼 014期】
- 【三維路徑規劃】基於matlab RRT演算法無人機路徑規劃【含Matlab原始碼 155期】
- 【優化求解】基於matlab GUI模擬退火演算法求解全域性最大值最小值問題【含Matlab原始碼 1242期】
- 【優化充電】基於matlab蒙特卡洛演算法求解電動汽車充電優化問題【含Matlab原始碼 1164期】
- 【定位問題】基於matlab GUI SLAM模擬地圖構建和定位【含Matlab原始碼 1120期】
- 【水果識別分類】基於matlab形態學水果識別分類【含Matlab原始碼 1132期】
- 【數學建模】基於matlab UKF自行車狀態估計【含Matlab原始碼 1111期】