【水果識別分類】基於matlab形態學水果識別分類【含Matlab原始碼 1132期】

語言: CN / TW / HK

一、簡介

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

「其他文章」