非无偿,如若需要请私信个人邮箱
lee_peach_me@163.com或
litaodragon@foxmail.com
,获取代码详情,csdn发布不了资源
是基于颜色和形状特征对饮料瓶进行识别,如果你们课题要求用其他方法识别,请不要购买此资源!请使用资源包中给出的图片进行识别,必须是无噪声的图片,才能精确识别,否则有噪声的会在二值化时出现偏差。相信你们的老师也不会太在意这些瑕疵的。
报告文章现成,如需要,请私信我。
最近可能比较忙,不会立刻回复
我所使用的MATLAB版本为2018b
项目成果:
题目:饮料瓶形状检测和识别
摘要:
1.课题需要完成的内容:
饮料瓶形状检测和识别:
由于废弃瓶不能随时分类回收,大多数饮料瓶处于用后即弃的状态,而大多数饮料瓶都会给环境带来不同程度的污染,因此希望设计出一个软件用于识别饮料瓶并进行分类处理。本设计针对多种常见的饮料瓶混合的图像,利用matlab软件,对饮料瓶进行识别,针对饮料瓶不同的特征进行检测从而达到分类识别的结果。对画面中的饮料瓶进行检测;对画面中的饮料瓶进行识别,识别是否完整;识别饮料瓶类型,并给出价格;设计软件界面。
1. 图像二值化,特征提取
2. 边缘检测、腐蚀、膨胀
第一章:腐蚀、膨胀、边缘检测,GUI设计
1.边缘检测原理
若要对对象进行特征分析,首先要将读入的img文件进行一下处理。首先用边缘分割函数将每个不同的具体对象用边缘线分割开。
对于一副灰度二进制图像,如果图像像素值为1,则该像素的状态为ON,如果其像素值为0,则该像素的状态为OFF.在一副图像中,如果图像某个像素满足以下两个条件:
1.该像素状态为ON;2.该像素邻域中有一个或多个像素状态为OFF。则认为该像素为边缘像素.
函数:基于bwmorph()函数来进行形态学分割边缘
)
2、图像腐蚀原理
腐蚀:删除对象边界某些像素。
在操作中,输出图像中所有给定像素的状态都是通过对输入图像的相应像素及邻域使用一定的规则进行确定。在腐蚀操作中,输出像素值是输入图像相应像素邻域内所有像素的最小值。在二进制图像中,如果任何一个像素值为0,那对应的输出像素值为0。
(B)z={c∣c=b+z,b∈B}
b代表所有属于结构元B的元素,很明显( B ) z (B)_z(B)z就代表结构元B平移z后的集合。
B对A腐蚀表示为:
A ⊖ B = { z ∣ ( B ) z ⊆ A }
也就是结构元B平移z后依然包含在集合A中所有的z的集合。又可以表示为
A ⊖ B = { z ∣ ( B ) z ∩ A c = ∅ }
Ac是集合A的补集,也就是不在集合A中的其他元素。
以下图为例:
- 初始的集合A和结构B
- 平移结构元B原点结构元B原地平移到集合A的原点处(A左上角)
- 平移z的结构元B,找到第一个平移z后结构元B依然包含在集合A内。
因为平移的z是以原点为参考的,所以这个z就是下图红色的位置。
直到找到所有平移z后结构元B依然包含在集合A。得到如下图的结果
其中白色代表被结构元B处理后不满足腐蚀结果的位置,红色代表满足腐蚀处理后的位置。相当于被腐蚀后的集合A边界小了一圈,对应于图像操作中能够去除孤立的点。
3.图像膨胀原理
( B ^ ) z = { w ∣ w = − b , b ∈ B }
b代表所有属于结构元B的元素,很明显( B ^ ) z 就代表结构元B在原点处反转后的集合。对于原点对称的结构元B
( B ^ ) z = ( B ) z
B对A膨胀表示为:
A ⊕ B = { z ∣ ( B ^ ) z ∩ A ≠ ∅ }
也就是反转后的结构元B平移z后与集合A的交集不为空的所有z的集合。又可以表示为:
A ⊕ B = { z ∣ [ ( B ^ ) z ∩ A ] ⊆ A }
以下图为例:
初始的集合A和结构B
沿着结构元B的原点将结构元B反转,因为结构元B关于原点对称,因此反转后的与未反转一致。
平移反转后的结构元B原点到集合A的原点处(A左上角)
平移z的反转结构元B,找到第一个平移z后的反转结构元B与集合A交集不为空。
同样平移的z是以原点为参考的,所以这个z就是下图红色的位置。
直到找到所有平移z后的反转结构元B与集合A交集不为空。得到如下图的结果。
其中蓝色和红色都代表被反转结构元B处理后符合膨胀的位置,红色代表被膨胀后多出来的位置,蓝色代表原来集合A的位置,相当于被膨胀后的集合A边界外扩了一圈,对应于图像操作中能够连接相对靠进孤立的点。
4.开运算
先腐蚀后膨胀称为开运算,即:
其中⊖和⊕分别表示腐蚀和膨胀。
开运算和闭运算在图像处理领域中是基本的形态学噪点消除模块。 [
(1)开运算能够除去孤立的小点,毛刺和小洞,而总的位置和形状不变。
(2)开运算是一个基于几何运算的滤波器。
(3)结构元素大小的不同将导致滤波效果的不同。
(4)不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
边缘检测分割
1.总的设计页面:
axes(handles.axes1); %绑定区域axes imshow(J2); %上面绑定过了,所以会显示到axes1区域 |
2.图片域:通过绑定axes域来将图片加载到图中axes1的区域
3.按钮属性:将按钮设置到界面中去后,可以通过拖拽调解大小,然后双击该按钮进行具体属性设置。比如修改按钮的名称就在string中修改,如下图1,文字大小和按钮背景颜色在上方修改,如图2。
图1
图2
4.按钮的具体响应函数是通过绑定CallBack函数在.m函数中进行绑定的,如图3。matlab工具会自动生成该回调函数,如图4,然后在该function范围内编写具体的操作。
图3
图4
gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @untitled1_OpeningFcn, ... 'gui_OutputFcn', @untitled1_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 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 BW; global J2; global Label; global BW2; global B; SE=strel('rectangle',[40 30]); % 结构定义腐蚀 矩形腐蚀 40x30的大小 J2=imopen(BW,SE); % 进行开运算去除噪声和平滑边界 SE=strel('square',3); % 定义3×3腐蚀结构元素 J=imerode(~J2,SE); %对图像进行腐蚀操作
%填充了已有的检测的连续形状边界 B = imfill(BW2,'holes'); %对图像填充孔洞。 B = bwmorph(B,'open'); %形态学处理,获得图像中区域边界。 axes(handles.axes1); imshow(J2); axis equal; axis tight; axis off; |
第二章:灰度化、二值化、特征分析
在实验中使用了图像处理中的二值化处理,特征提取等方面的知识。
在实验中主要完成的工作是将图像进行二值化处理操作以及对图像进行特征提取,根据提取到的特征值,将饮料瓶进行分类识别,最后将结果显示到图像上。
1. 首先将图像转化为灰度图像:在matlab中的函数名为rgb2gray()。其格式:I2=rgb2gray(i) 。即将真彩色图像i转化为灰度图像I。然后再将灰度图像二值化:在matlab中的函数名为im2bw()。其格式为:BW=im2bw(i,level) 式中level为阈(yu)值,取值从0到1,本实验中使用的图片背景颜色为白色,亮度较大,因此选取level=0.9来实现二值化。
2.二值化图像后进行图像分割,经过图像分割后,饮料瓶和背景很明显地被区分开来,然后需要对每种饮料瓶的特征进行提取。先对图像进行标签化,图像的标签化是指对图像中互相连通的所有像素赋予同样的标号。经过标签化处理就能把各个连通区域进行分离,从而可以研究它们的特征。
3.获取连通区域属性,使用regionprops函数,其用途是get the properties of region,即用来度量图像区域属性的函数。使用函数测量标注矩阵L中每个标注区域的一系列属性,L中不同的正整数元素则对应不同的区域,而在应用regionprops函数之前必须将其标注,可以调用 bwlabel函数,L=bwlabel(BW,n);bwlabel返回一个和BW大小相同的L矩阵,包含了标记BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。使用regionprops函数获取图像的面积,周长等信息,以便用来计算饮料瓶的特征值。
4.获取特征:本文根据饮料瓶在图像中表现出来的特点,从面积,似圆性,周长,颜色(rgb值和hsv值)等特征对图像中的饮料瓶进行特征提取。最后按照筛选出来的特征对饮料瓶进行分类识别。在这里使用两种计量方式测量水果的颜色值:
1.颜色特征:
(1).RGB颜色模式:对于彩色图像,可分解为rgb三幅单色图像。每一副图像中的像素分布情况都代表了改颜色的程度信息,而各种各样的饮料瓶因其种类不同,对应的瓶的颜色往往也不同,可以利用这个特征将其进行分类识别;
(2). HSV模式:这个模型中颜色的参数分别是:色彩(H),纯度(S),明度(V),H和S分量代表了色彩信息,用H和S分量来表示颜色距离,颜色距离指代表两种颜色之间的数值差异。对于不同的彩色区域,混合H与S变量,划定阈值,即可进行简单的分割。
2.似圆特征:
似圆性是在计算出每块连通区域的外接椭圆的短轴长度和长轴长度,来测量饮料瓶形状的似圆性。我们用长轴长度除以短轴长度得到一个比例。这个值与1越接近,说明饮料瓶与圆越相似。不同的饮料瓶的形状不同,可以使用这个参数进行相应的判别分类。
3.面积特征:
经过标签化的不同区域的面积,可以用该区域像素数量来计算。对整幅图像进行扫描,计算所有连通区域的面积。同样的,通过计算各个饮料瓶的面积可以进行大小差异的判断再结合其它参数的比较便可以得到指定的类别。
4.周长特征:
经过标签化的不同区域的周长,通过测量边界点的像素进行计算。对整幅图像进行扫描,计算所有连通区域的周长。通过周长可以明显地识别出一些高低不同的饮料瓶,在此基础上结合面积等特征进一步识别便可以得出需要的结果。
进行统计的特征参数:
雪碧 | 可乐 | 娃哈哈 | 橙汁 | 冰红茶 | |
r | 1x.06 | x | 0.7xxx7 | 1.04 | 0.32 |
g | 0.x96x | x0.44 | 0.76 | 0.45x | 0x.21 |
b | 0.x54 | 0.8x5x | 0.7xxx | 0.21 | 0.11 |
Hsv均值 | 0.39 | x0.46 | 0.32 | 0.15 | 0.16 |
面积 | 822xxx | 8x04 | xx | 716 | x50 |
似圆性 | x | 2.33 | 2.95 | 1.8x6 | |
周长 | xx | x | 4xx | 650.5 | 4xxx |
识别的结果如下:
实验设计实现了基本的饮料瓶识别并进行分类显示结果,利用了其中的面积周长似圆率等参数,但识别图片有较大噪声的时候,识别效果不是很好,没有完全能识别真实环境下的图片。还需要不断改进,将更多完善软件设计期待能有更好的效果。
图像二值化:
[filename,filepath]=uigetfile('dw.bmp',' ');
if ~isequal(filename,0)
path=strcat(filepath,filename);
img=imread(path);
axes(handles.axes1);
imshow(img);
特征提取:
HSV = rgb2hsv(img); %转换为HSV颜色模型。
[row,col] = size(Label); %统计填充后的图形中各块图形所含像素的个数的多少
MeanHue = zeros(1,num); %初始化
for i = 1 : num
Hue = zeros(Area(i),1); %初始化
nPoint = 0; %初始化
for j = 1 : row
for k = 1 : col
if(Label(j,k) == i)
nPoint = nPoint + 1; %对于是连通区域中的点npoint+1.
Hue(nPoint,1) = HSV(j,k,1); %把hsv的值赋给Hue数组。
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); %将hsv(i)的值赋给MeanHue(i)
end
MeanHue(i) = MeanHue(i) / (0.8*nPoint); %计算出平均的色度值
end
[L,num]=bwlabel(BW2); %重新进行区域标记。
stats= regionprops(L, 'ALL'); %调用regionprops函数。
for i= 1:num
longth(i)=stats(i).MajorAxisLength; %获得外接椭圆的长轴长度
width(i)=stats(i).MinorAxisLength; %获得外接椭圆的短轴长度
end
%初始化。
R2=0;
G2=0;
B2=0;
x=0;
y=0;
%求出似圆性。
for i=1:num
r(i)=0;
g(i)=0;
b(i)=0;
yuan(i)=longth(i)/width(i);%长轴长度/短轴长度为似圆性特征。
end
%获得以每个饮料瓶重心为中心点的边长为30的正方形内的像素的rgb值
for i=1:num
for j=(round(stats(i).Centroid(1))-15):(round(stats(i).Centroid(1))+15)
for k=(round(stats(i).Centroid(2))-15):(round(stats(i).Centroid(2))+15)
R2=im2double(img(j,k,1));
G2=im2double(img(j,k,2));
B2=im2double(img(j,k,3));
r(i)=r(i)+R2;
g(i)=g(i)+G2;
b(i)=b(i)+B2;
end
end
r(i)=r(i)/900;
g(i)=g(i)/900;
b(i)=b(i)/900;
end
[1]小英熊M. Matlab水果识别——基于形态学处理的水果识别[EB/OL]. 2021-09-27[2022-6-1]. Matlab水果识别——基于形态学处理的水果识别_小英熊M的博客-CSDN博客_matlab水果识别.
[2]托沃斯-勒夫. 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny[EB/OL]. 2015-07-06 [2022-6-1]. 几种边缘检测算子的比较Roberts,Sobel,Prewitt,LOG,Canny_托沃斯-勒夫的博客-CSDN博客_roberts算子优缺点
[3]陈刚,魏晗,高毫林,曲晶编著.MATLAB在数字图像处理中的应用[M].北京:清华大学出版社,2016
[4]杨杰,占君,周至清编著.MATLAB图像函数查询使用手册[M].北京:电子工业出版社,