天天看點

【水果蔬菜識别】基于matlab GUI灰階+二值化+腐蝕+直方圖處理水果蔬菜識别【含Matlab源碼 1052期】

一、水果蔬菜識别簡介

0 引 言

随着計算機技術的發展,圖像識别技術被應用到各大領域。在農業領域中,圖像識别技術的應用也較為廣泛。例如,農作物蟲害圖像識别,農産品自動分揀及品質分級等等。我國是水果大國,對于水果圖像識别的研究尤為重要。水果圖像識别能對不同水果進行識别分類,有利于水果的自動分揀及水果品質分級。在西方的發達國家,已經開始對水果行業智能化、規模化,在選果包裝工廠中的房間中,已經普遍采用無損傷檢測手段。是以,水果圖像識别技術具有很大的效益潛力。

20世紀80年代初,國内外學者開始對水果識别分類進行研究,包括研究水果的計算機自動識别分類等。但是傳統的水果識别僅僅基于水果的輪廓曲線特征或者顔色特征,識别精度不高,分類效果較差。近年來,随着計算機技術的提升和新型算法的提出,出現了一些基于模式識别算法的較新方法,比如基于卷積神經網絡的水果識别系統和基于深度學習的水果圖像識别系統。

最初,深度學習是為了解決圖像識别問題而提出的;如今,深度學習已經在圖像、語音等方面取得了重大突破。目前,深度學習技術已經廣泛應用到圖像識别中,主要應用于圖像的分類識别、圖像的目标檢測、圖像修複和圖像分割等領域。

鑒于圖像識别技術的發展及國内外研究現狀,本文提出一種基于門檻值分類器的水果識别系統。水果圖像識别的研究将有利于水果分揀實作智能化,同時,也給其他圖像識别領域提供了一定的參考。

1 水果識别系統構成

1.1 水果識别流程圖

一個基本的圖像識别系統主要由圖像采集、圖像預處理、圖像特征提取、圖像識别算法等步驟組成。每一步驟都會對圖像識别的精度起着至關重要的作用,但是根據研究的不同,可以适當的側重其中一個流程。本文水果系統識别流程如圖1所示。

圖1 水果識别流程

1.2 水果圖像預處理

在分析和使用圖像之前,需要對圖像進行預處理,包括水果圖像二值化、形态學處理,水果圖像填充和水果圖像邊緣檢測。

水果圖像二值化處理一般采用OTSU算法。水果圖像經二值化處理後仍然有一些獨立的小白點,而且邊緣有許多毛刺,整體二值化圖像不圓潤,不是很光滑,于是對二值化的圖像進行形态學處理,并對二值化圖像進行開運算。開運算處理之後,再對圖像進行邊緣檢測、水果圖像填充。

2 水果特征提取

特征是一個對物體進行描述的量,任何識别算法都需要選取一個好的特征,這是確定算法有效的關鍵。為了識别不同種類的水果,采集到的水果圖像經預處理後,還需要進行特征提取。水果較為明顯的特征包括:顔色特征、形狀特征及紋理[7]。就本研究而言,主要考慮的是水果的形狀特征。水果形狀特征是識别水果種類的要重依據,水果形狀特征比較多,主要包括水果的大小、水果的周長、水果的面積、水果的圓度、水果的離心率等等。

在水果識别中,桃子和蘋果的形狀更加圓滑,也更加接近圓形;香蕉形狀比較長,它是屬于條形的;而像鳳梨則類似一個矩形。對水果整體區域進行填充時,可以通過圖像像素的個數求出的水果面積S,也可以根據邊緣檢測求出水果的周長L。用圓度t來表示與圓形的近似程度,則有:

【水果蔬菜識别】基于matlab GUI灰階+二值化+腐蝕+直方圖處理水果蔬菜識别【含Matlab源碼 1052期】

式中:π是圓周率;S是圖像面積;L是圖像的周長。

水果識别中,先求出圓度t,圓度越趨近于1,說明水果形狀越近似為圓形,圓度越趨近于0,說明水果形狀偏離圓形。除了圓度t,還設定了其他形狀參數,比如離心率e,長軸和短軸之比f等。本文選擇不同水果圖像,對其形狀特征參數進行比對,見表1所列。通過表1可以看出,水果的種類不同,其形狀特征參數差别比較大,就圓度而言,桃子的圓度接近為1,故其形狀與圓相近;鳳梨的圓度最小,接近為0,其形狀與圓形差别比較大,與實際情況大緻相符。

【水果蔬菜識别】基于matlab GUI灰階+二值化+腐蝕+直方圖處理水果蔬菜識别【含Matlab源碼 1052期】

3 門檻值分類器

圖像的精準識别是一個比較困難的研究課題,圖像識别技術是模式識别技術的一個重要分支。基于圖像的模式識别流程如圖3所示。

【水果蔬菜識别】基于matlab GUI灰階+二值化+腐蝕+直方圖處理水果蔬菜識别【含Matlab源碼 1052期】

圖3 模式識别流程

從圖3可以看出,模式識别主要包括訓練和測試兩個方面,其中,圖像的訓練尤為重要。在訓練資料時,訓練算法起至關重要的作用。識别分類算法即對提取的特征進行訓練測試,是水果識别系統核心。

二、部分源代碼

function varargout = untitled(varargin)
% UNTITLED MATLAB code for untitled.fig
%      UNTITLED, by itself, creates a new UNTITLED or raises the existing
%      singleton*.
%
%      H = UNTITLED returns the handle to a new UNTITLED or the handle to
%      the existing singleton*.
%
%      UNTITLED('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in UNTITLED.M with the given input arguments.
%
%      UNTITLED('Property','Value',...) creates a new UNTITLED or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before untitled_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to untitled_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help untitled

% Last Modified by GUIDE v2.5 15-Jan-2017 01:03:42

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @untitled_OpeningFcn, ...
                   'gui_OutputFcn',  @untitled_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before untitled is made visible.
function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled (see VARARGIN)

% Choose default command line output for untitled
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes untitled wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = untitled_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I FilledLabel HSV MeanHue  Ecllipseratio Label num Premeter Area
 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');  %填充打過标記的邊界線中間圍成的圖形區域
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) = 4*pi*Area(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
%識别菠胡蘿蔔

%建構胡蘿蔔的分類器,在二維特征空間對各個圖像進行類别區分
huluobo=1;
mazarea=Area(1);
for i=1:num
    if(mazarea<Area(i))%分類器識别桃的準則:判斷各個圖形中面積最大的為胡蘿蔔
        mazarea=Area(i);
        huluobo=i;
    end
end
%對分出來的類别分别建構相應的圖像掩膜,并用對原圖的亮度圖像進行掩膜操作
huluoboHSV=HSV;
        for j = 1 : row
            for k = 1 : col
                if(FilledLabel(j,k) ~=huluobo)
                       %huluoboHSV(j,k,2)=0;
                       huluoboHSV(j,k,3)=0;
                end
            end
        end
%變換生成最終的結果圖像,圖像中顯示的結果即對應分類器中指定的類别
huluobomatrix = hsv2rgb(huluoboHSV);%轉換為RGB彩圖,彩圖中已經濾去了其餘水果,隻剩下胡蘿蔔
subplot(2,2,4),imshow(huluobomatrix);




% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global I Area FilledLabel HSV MeanHue  Ecllipseratio Label num Premeter
%計算各個圖形單元的周長   用連接配接像素點或數邊界像素點個數的方法   numPoints數組表示各個圖形邊界的像素個數(即用個數來表示周長)
 %num = max(max(Label));

    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');  %填充打過标記的邊界線中間圍成的圖形區域
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

           

三、運作結果

四、matlab版本及參考文獻

繼續閱讀