` 本帖最后由 乂统天下 于 2020-8-16 20:21 编辑
新手学习,多多关照,互相交流,共同进步^-^
【实现功能】图像处理纸币币值视觉检测系统设计[Tested]
1.可以检测图像中数目不定的人民币100元、50元、20元和10元纸币
2.设计包含视觉检测硬件系统和软件算法,
3.检测出图像中统计各种面值纸币的张数,标记每种纸币在图像中的位置坐标,并自动计算得到视野中纸币的总币值。
4.已配置相关参数,设计了实验方案,且验证了算法的合理性。
5.含GUI源代码、调试记录报告
【处理效果】
NO.1:检测含100、10、50元的图像
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
NO.2:检测含100、20元的图像
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
NO.3:检测含100[new]、100[old]元的图像
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
NO.4: 检测含100[new]、100[old]元的图像 <摆放不整齐>
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
NO.5:检测含100[new]、100[old]、50、20、10元的图像 <摆放不整齐>
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
【改进分析】
1.增加了导入本地图像按钮
2.优化了GUI界面设计
3.优化了识别算法
优化效果如下所示=检测含100[new]、50元的图像 <摆放不整齐>
这是数字摄像头采集到的图像▼
这是处理之后添加标记的图像▼
这是matlabGUI界面显示窗口▼
【程序展示】
由于代码较多,不便全部展示,需要源代码、调试记录等相关文件请自行下载。
一下代码为图像处理部分,以供参考,希望有所帮助。
- global frame
- global C_SS
- % image = imread('F:数字图像处理LY_课程设计纸币 est4.JPG');
- image= frame ;
- image_size=size(image);
- dimension=numel(image_size);
- if dimension==2
- fprintf('%s','灰度图像');
- I = image;
- elseif dimension==3
- fprintf('%s','彩色图像');
- I = rgb2gray(image);
- end
- %% NO.2 预处理 中值滤波 = F0
- F0=medfilt2(I,[5,5]);
- % figure
- % subplot(1,2,1),imshow(image,[]);title('原图=[彩色]');
- % subplot(1,2,1),imshow(I,[]);title('原图=[灰度]');
- % subplot(1,2,2),imshow(F0,[]);title('中值=[5,5]');
- %% NO.3 阈值处理 = Y0
- [T,SM]=graythresh(F0); % Global image threshold using Otsu's method//Otsu法计算阈值
- Y0=imbinarize(F0,T); % 原图=阈值分割[Otsu法]
- % figure % 显示
- % subplot(1,2,1),imshow(I),title('原图');
- % subplot(1,2,2),imshow(Y0);title('原图=阈值分割[Otsu法]');
- %% NO.4 形态学处理 = bw4
- bw1=Y0;
- % bw2 = bwareaopen(bw1,30); %删除包含少于30像素的所有对象 //消除噪音
- se = strel('disk',2);
- % bw3 = imclose(bw1,se); %填补笔帽上的空白
- bw4 = imfill(bw1,'holes'); %填充任何孔,以便区域道具可用于 估计每个边界所包围的区域
- % subplot(2,3,1),imshow(I),title('原图');
- % subplot(2,3,2),imshow(bw1),title('阈值分割');
- % figure,imshow(bw2),title('消除噪音');
- % figure,imshow(bw3),title('填补空白');
- % figure,imshow(bw4),title('填充任何孔'); % 图5
- %% NO.5 提取、识别图像
- F=image; % 原始图像
- count_100=0; % 设置初值
- count_20=0;
- count_50=0;
- count_10=0;
- % [labeled,numObjects]=bwlabel(bw4,8); % 标签连通分量
- f=bw4;
- [L,n]= bwlabel(f);
- max(max(L)); % 图像中纸币的个数
- % L returns a label matrix
- % n returns the number of connected objects found in BW
- % 函数find(见5.2.2节)在处理标记矩阵时非常有用。
- % 例如,以下对find的调用将返回属于第三个对象的所有像素的行索引和列索引:
- % 可以使用一个循环来 提取计算和显示特征图像
- % figure,imshow(F);title('标注标号'); % 图6
- axes(handles.axes2); % 显示图像
- imshow(F);title('标注标号');
- hold on % So later plotting commands plot on top of the image.
- for k = 1:n
- [r,c]= find(L == k);
- rbar1 = min(r);
- cbar1 = min(c);
- rbar2 = max(r);
- cbar2 = max(c);
- G=F(rbar1:rbar2,cbar1:cbar2,:); % 提取纸币
- G1=size(G,1);
- G2=size(G,2);
- G_feature1=G(1:round(G1*1),round(G2*0.6):round(G2*0.96),:);% 提取纸币特征位置
- G_feature1_R=sum(sum(G_feature1(:,:,1))); % R分量
- G_feature1_G=sum(sum(G_feature1(:,:,2))); % G分量
- G_feature1_B=sum(sum(G_feature1(:,:,3))); % B分量
- G_feature1_S=G_feature1_R+G_feature1_G+G_feature1_B;
- RGB(1)=G_feature1_R/G_feature1_S; %R分量
- RGB(2)=G_feature1_G/G_feature1_S; %G分量
- RGB(3)=G_feature1_B/G_feature1_S; %B分量
- G_feature1_max=max(RGB);
- rgb= find(RGB == G_feature1_max);
- % 纸币识别
- if rgb==1
- if RGB(2)<=0.3
- count_100=count_100+1;
- [r,c]= find(L == k); % 定位
- rbar = mean(r);
- cbar = mean(c);
- plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
- plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
- text(cbar,rbar,num2str(count_100),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
- text(cbar,rbar,' 100','Color','white','FontSize',14); % 标注面值
- else
- count_20=count_20+1;
- [r,c]= find(L == k); % 定位
- rbar = mean(r);
- cbar = mean(c);
- plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
- plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
- text(cbar,rbar,num2str(count_20),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
- text(cbar,rbar,' 20','Color','white','FontSize',14); % 标注面值
- end
- elseif rgb==2
- count_50=count_50+1;
- [r,c]= find(L == k); % 定位
- rbar = mean(r);
- cbar = mean(c);
- plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
- plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
- text(cbar,rbar,num2str(count_50),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
- text(cbar,rbar,' 50','Color','white','FontSize',14); % 标注面值
- else
- count_10=count_10+1;
- [r,c]= find(L == k); % 定位
- rbar = mean(r);
- cbar = mean(c);
- plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
- plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w'); % 标注 *
- text(cbar,rbar,num2str(count_10),'HorizontalAlignment','left','Color','black','FontSize',25); % 标注标号
- text(cbar,rbar,' 10','Color','white','FontSize',14); % 标注面值
- end
- end
复制代码
【源码下载】
下载链接:https://lanzous.com/iajjjmj
下载内容:源代码、报告、PPT、调试记录(测试图像)
下载密码:3b2d
代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!
`
4
评分
-
查看全部评分
|
|
|
|