Matlab论坛
直播中

乂统天下

5年用户 232经验值
擅长:可编程逻辑 测量仪表 嵌入式技术 控制/MCU
私信 关注

源码交流=图像处理 纸币币值视觉检测系统[Tested]

` 本帖最后由 乂统天下 于 2020-8-16 20:21 编辑

新手学习,多多关照,互相交流,共同进步^-^
【实现功能】图像处理纸币币值视觉检测系统设计[Tested]
1.可以检测图像中数目不定的人民币100元、50元、20元和10元纸币
2.设计包含视觉检测硬件系统和软件算法,
3.检测出图像中统计各种面值纸币的张数,标记每种纸币在图像中的位置坐标,并自动计算得到视野中纸币的总币值。
4.已配置相关参数,设计了实验方案,且验证了算法的合理性。
5.含GUI源代码、调试记录报告

【处理效果】
NO.1:检测含100、10、50元的图像
这是数字摄像头采集到的图像▼

这是处理之后添加标记的图像▼
1+.jpg
这是matlabGUI界面显示窗口▼
1-.JPG

NO.2:检测含100、20元的图像  
这是数字摄像头采集到的图像▼ 3.jpg
这是处理之后添加标记的图像▼

3+.jpg
这是matlabGUI界面显示窗口▼  
3-.JPG


NO.3:检测含100[new]、100[old]元的图像  
这是数字摄像头采集到的图像▼

5.jpg
这是处理之后添加标记的图像▼

5+.jpg
这是matlabGUI界面显示窗口▼  

5-.JPG

NO.4: 检测含100[new]、100[old]元的图像 <摆放不整齐>
这是数字摄像头采集到的图像▼

6.jpg
这是处理之后添加标记的图像▼

6+.jpg
这是matlabGUI界面显示窗口▼  
6-.JPG

NO.5:检测含100[new]、100[old]、50、20、10元的图像 <摆放不整齐>

这是数字摄像头采集到的图像▼ 9.jpg
这是处理之后添加标记的图像▼
9+.jpg
这是matlabGUI界面显示窗口▼  
9-.JPG

【改进分析】

1.增加了导入本地图像按钮
2.优化了GUI界面设计
3.优化了识别算法
优化效果如下所示=检测含100[new]、50元的图像 <摆放不整齐>
这是数字摄像头采集到的图像▼  
10.jpg
这是处理之后添加标记的图像▼  

10+.jpg
这是matlabGUI界面显示窗口▼

10-.PNG

【程序展示】
由于代码较多,不便全部展示,需要源代码、调试记录等相关文件请自行下载。
一下代码为图像处理部分,以供参考,希望有所帮助。
  1. global frame
  2. global C_SS
  3. % image = imread('F:数字图像处理LY_课程设计纸币        est4.JPG');
  4. image= frame ;
  5. image_size=size(image);
  6. dimension=numel(image_size);
  7. if dimension==2
  8.     fprintf('%s','灰度图像');
  9.     I = image;
  10. elseif dimension==3
  11.     fprintf('%s','彩色图像');
  12.     I = rgb2gray(image);
  13. end

  14. %% NO.2  预处理 中值滤波 = F0
  15. F0=medfilt2(I,[5,5]);
  16. % figure
  17. % subplot(1,2,1),imshow(image,[]);title('原图=[彩色]');
  18. % subplot(1,2,1),imshow(I,[]);title('原图=[灰度]');
  19. % subplot(1,2,2),imshow(F0,[]);title('中值=[5,5]');

  20. %%  NO.3  阈值处理 = Y0
  21. [T,SM]=graythresh(F0);   % Global image threshold using Otsu's method//Otsu法计算阈值
  22. Y0=imbinarize(F0,T);          % 原图=阈值分割[Otsu法]
  23. % figure  % 显示
  24. % subplot(1,2,1),imshow(I),title('原图');
  25. % subplot(1,2,2),imshow(Y0);title('原图=阈值分割[Otsu法]');

  26. %%  NO.4  形态学处理 = bw4
  27. bw1=Y0;
  28. % bw2 = bwareaopen(bw1,30);    %删除包含少于30像素的所有对象   //消除噪音
  29. se = strel('disk',2);
  30. % bw3 = imclose(bw1,se);       %填补笔帽上的空白
  31. bw4 = imfill(bw1,'holes');     %填充任何孔,以便区域道具可用于 估计每个边界所包围的区域
  32. % subplot(2,3,1),imshow(I),title('原图');
  33. % subplot(2,3,2),imshow(bw1),title('阈值分割');
  34. % figure,imshow(bw2),title('消除噪音');
  35. % figure,imshow(bw3),title('填补空白');
  36. % figure,imshow(bw4),title('填充任何孔'); % 图5


  37. %%  NO.5  提取、识别图像
  38. F=image;           % 原始图像
  39. count_100=0;    % 设置初值
  40. count_20=0;
  41. count_50=0;
  42. count_10=0;
  43. % [labeled,numObjects]=bwlabel(bw4,8); % 标签连通分量
  44. f=bw4;
  45. [L,n]= bwlabel(f);  
  46. max(max(L)); % 图像中纸币的个数
  47. % L  returns a label matrix
  48. % n  returns the number of connected objects found in BW
  49. % 函数find(见5.2.2节)在处理标记矩阵时非常有用。
  50. % 例如,以下对find的调用将返回属于第三个对象的所有像素的行索引和列索引:
  51. % 可以使用一个循环来 提取计算和显示特征图像
  52. %  figure,imshow(F);title('标注标号'); % 图6
  53. axes(handles.axes2); % 显示图像
  54. imshow(F);title('标注标号');
  55. hold on    % So later plotting commands plot on top of the image.
  56. for k = 1:n
  57.     [r,c]= find(L == k);
  58.     rbar1 = min(r);
  59.     cbar1 = min(c);   
  60.     rbar2 = max(r);
  61.     cbar2 = max(c);
  62.     G=F(rbar1:rbar2,cbar1:cbar2,:); % 提取纸币
  63.     G1=size(G,1);
  64.     G2=size(G,2);
  65.     G_feature1=G(1:round(G1*1),round(G2*0.6):round(G2*0.96),:);% 提取纸币特征位置
  66.     G_feature1_R=sum(sum(G_feature1(:,:,1)));   %   R分量
  67.     G_feature1_G=sum(sum(G_feature1(:,:,2)));   %   G分量
  68.     G_feature1_B=sum(sum(G_feature1(:,:,3)));   %   B分量
  69.     G_feature1_S=G_feature1_R+G_feature1_G+G_feature1_B;
  70.     RGB(1)=G_feature1_R/G_feature1_S; %R分量
  71.     RGB(2)=G_feature1_G/G_feature1_S; %G分量
  72.     RGB(3)=G_feature1_B/G_feature1_S; %B分量
  73.     G_feature1_max=max(RGB);
  74.     rgb= find(RGB == G_feature1_max);
  75. %     纸币识别
  76.     if rgb==1
  77.         if RGB(2)<=0.3
  78.             count_100=count_100+1;
  79.             [r,c]= find(L == k);  % 定位
  80.             rbar = mean(r);
  81.             cbar = mean(c);
  82.             plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
  83.             plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w');        % 标注 *
  84.             text(cbar,rbar,num2str(count_100),'HorizontalAlignment','left','Color','black','FontSize',25);       % 标注标号
  85.             text(cbar,rbar,'   100','Color','white','FontSize',14);       % 标注面值
  86.         else
  87.             count_20=count_20+1;
  88.             [r,c]= find(L == k);  % 定位
  89.             rbar = mean(r);
  90.             cbar = mean(c);
  91.             plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
  92.             plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w');     % 标注 *
  93.             text(cbar,rbar,num2str(count_20),'HorizontalAlignment','left','Color','black','FontSize',25);       % 标注标号
  94.             text(cbar,rbar,'   20','Color','white','FontSize',14);       % 标注面值
  95.         end
  96.     elseif rgb==2
  97.         count_50=count_50+1;
  98.         [r,c]= find(L == k);  % 定位
  99.         rbar = mean(r);
  100.         cbar = mean(c);
  101.         plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
  102.         plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w');     % 标注 *
  103.         text(cbar,rbar,num2str(count_50),'HorizontalAlignment','left','Color','black','FontSize',25);       % 标注标号
  104.         text(cbar,rbar,'   50','Color','white','FontSize',14);       % 标注面值
  105.     else
  106.         count_10=count_10+1;
  107.         [r,c]= find(L == k);  % 定位
  108.         rbar = mean(r);
  109.         cbar = mean(c);
  110.         plot(cbar,rbar,'Marker','o','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',10);
  111.         plot(cbar,rbar,'Marker','*','MarkerEdgeColor','w');     % 标注 *
  112.         text(cbar,rbar,num2str(count_10),'HorizontalAlignment','left','Color','black','FontSize',25);       % 标注标号
  113.         text(cbar,rbar,'   10','Color','white','FontSize',14);       % 标注面值
  114.     end

  115. end

【源码下载】
下载链接:https://lanzous.com/iajjjmj                                
下载内容:源代码、报告、PPT、调试记录(测试图像)         
下载密码:3b2d                                                                   

代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,请留下您的赞,您的支持是我坚持写作分享的最大动力,谢谢!





` 1.jpg
MATLAB GUI图像处理纸币币值视觉检测系统设计[报告、PPT].zip (10.76 MB)
(下载次数: 39, 2020-4-11 13:39 上传)
MATLAB GUI图像处理纸币币值视觉检测系统设计[源代码].zip (51.93 KB)
(下载次数: 9, 2020-4-11 13:39 上传)

回帖(1)

乂乂统天下

2022-9-8 16:14:26
此帖仅作者可见
举报

更多回帖

发帖
×
20
完善资料,
赚取积分