苏ICP备112451047180号-6
基于matlab的水果识别系统
1.摘要
通过matlab软件对水果图像进行处理,从而正确识别香蕉和水果。
2.引言
图像识别是模式识别的一个分支,具有广泛的应用场景。可以应用于货物分拣,自动分类等场景。以水果识别程序为基础,可以进一步开发其他图像识别程序。
3.基础知识
对图像的识别通常要经历图像增强,图像复原,图像分割,特征提取四个步骤。
图像增强和图像复原属于预处理部分,预处理过程的好坏对之后图像分割和特征提取的效果影响很大。
图像增强的作用是将低对比度的图像转化为高对比度的图像。
图像复原的作用是消除图像中的噪声。
图像分割的目的是将目标物体与背景区分。
这里选择的图像是清晰,对比度高的图像,因此图像增强和图像复原操作可以省略。
特征提取是通过一定的标准,对我们感兴趣的特征进行描述。通过特征的值与对照组的特征值进行比较,即可获得判定结果。
4.功能介绍
对于给定的单个水果的图片,能够正确识别图中的水果是香蕉还是苹果。
对于其他物体,能够给出识别失败的提示信息。
5.功能设计
根据日常生活中的经验,要正确判断一个水果是香蕉还是苹果,可以从三方面进行考虑:一是形状,二是颜色,三是纹理。以下分别从这几种思路入手,尝试识别两种水果。
1.从形状的角度
苹果的形状近似于圆形,香蕉的形状近似于月牙。根据数学知识,圆形的面积与周长之比最大,因此苹果的周长与面积的比值应该小于香蕉。因此,物体的周长与面积的比值可以视作图像的特征之一,可以用来区分两种水果。
2.从颜色的角度
苹果多为红色或绿色,香蕉多为黄色。颜色的区别较大,因此可以从颜色可以作为比较特征。但是由于灰度值与RGB值是一对多的关系,这个特征的实际应用效果不好。经过实验测试,舍弃颜色这个特征。
3.从纹理的角度
苹果表面较为光滑,香蕉的表面较粗糙。因此二者表面的纹理有差异,可以视作特征之一。在实验中,使用图像灰度值的二阶矩作为物体的纹理特征。
6.实验结果
分别使用香蕉,苹果,梨,菠萝,lena图作为测试数据。
7.总结体会
这次实验采用两个特征进行图像识别,特征的数量较少,因此在识别的准确率上有一些欠缺。要进一步提升准确率,需要加入更多的特征。
是否正确对图像进行预处理,在很大程度上影响之后的特征提取以及图像的识别。为了提高预处理的效果,可以采用matlab的图像工具库。通常来说,图像工具库的函数效果要优于自己实现的对应函数。
8.参考文献
1)RafaelC.Gonzalez, RichardE.Woods, StevenL.Eddins,等. 数字图像处理(MATLAB版)[M]. 电子工业出版社, 2013.
9.代码
1.主程序
close all;
clear all;
[filename,pathname]=uigetfile('.jpg');%从电脑中获取等待计算的图像地址
pathfile=fullfile(pathname,filename);%连接图像路径
apple=imread('apple.jpg');%用于判断的标准苹果图像
banana=imread('banana.jpg');%用于判断的标准香蕉图像
test=imread(pathfile);
[col_a,wan_a]=cal(apple);%分别计算标准图像与待计算图像的纹理特征和形状特征
[col_b,wan_b]=cal(banana);%具体注释见函数内部
[col_t,wan_t]=cal(test);
bc=0;%纹理值,0说明与苹果纹理相近,1说明与香蕉纹理相近
bw=0;%形状特征,0说明与苹果的形状相近,1说明与香蕉的形状相近
if(abs(col_a-col_t)<abs(col_b-col_t))%判断特征的相似程度
bc=0;
else
bc=1;
end
if(abs(wan_a-wan_t)<abs(wan_b-wan_t))
bw=0;
else
bw=1;
end
if(bc==0&bw==0)%两个特征即可认为是正确识别
msgbox('输入的图像为苹果','运算结果');
else
if(bc==1&bw==1)
msgbox('输入的图像为香蕉','运算结果');
else
msgbox('输入的图像不是苹果或香蕉','运算结果');%只有一个特征符合,认为是识别失败
end
end
2.计算纹理值
function [ O ] = cal_cor( I,E )
%使用二阶矩表示图像的纹理特征
%I为输入的灰度图像,E为I的边缘信息
F=imfill(E,'holes');
%figure,imshow(E);
%figure,imshow(F);
O=0;
T=0;
num=0;
[m,n]=size(I);
for i=1:m
for j=1:n
if(F(i,j)>0)
num=num+1;
T=T+power(double(I(i,j)),2);
O=O+double(I(i,j));%类型转换
end
end
end
T=T/num;
O=O/num;
O=O*O;
O=T-O;
O=sqrt(O);
end
3.计算形状特征
function [ O ] = cal_wan( I,E )
%使用图形周长与面积的比值表示物体的形状特征
%I为输入的灰度图像,E为I的边缘信息
F=imfill(E,'holes');
area=0;%面积
per=0;%周长
[m,n]=size(I);
for i=1:m
for j=1:n
if(E(i,j)>0)
per=per+1;
end
end
end
for i=1:m
for j=1:n
if(F(i,j)>0)
area=area+1;
end
end
end
O=double(per)/(area-0);
end
4.计算纹理值与形状特征
function [ col,wan ] = cal( I )
%计算图像的形状特征与纹理特征
%I为RGB图像
I=rgb2gray(I);
E=gray2edge(I);%获取边缘信息
col=cal_cor(I,E);%计算纹理特征
wan=cal_wan(I,E);%计算形状特征
end
5.边缘提取
function [O] = gray2edge( I )
%为灰度图像提取边缘信息
%I为灰度图像
I=imbinarize(I,graythresh(I));%图像分割
SE=strel('octagon',9); % 结构定义
J2=imopen(I,SE); % 开启运算
%figure,imshow(J2),title('对二值图像进行开运算后的结果图像');
J=imerode(~J2,SE);
O=(~J2)-J;% 检测边缘
%figure,imshow(O),title('3*3腐蚀运算后的图像边界轮廓');
end

