⛄一、硬币图像识别简介
本设计为硬币图像识别统计装置,通过数码相机获取平铺无重叠堆积的硬币的图像,并通过Matlab工具处理后统计硬币的数目。
1 图像格式转换
取的图像格式为RGB彩色图像,需要先将其转换为8位256级的灰度图像。本程序采用Matlab的图像处理工具箱的函数rgb2gray来实现。
rgb2gray()
功能:
转换RGB图像或颜色映像表为灰度图像。
语法:
I = rgb2gray(RGB)
newmap = rgb2gray(map)
2 去噪及特征提取
图1-2 灰度图及其直方图
上图1-1为硬币统计的局部图片,图中可见,硬币主体部分和背景以及图像有着明显的区别,可以通过选取合适的阈值进行二值化,从而提取出硬币的特征。
图1-2为此图像的直方图,从图中可见到比较明显的阈值分界点,但是并不是非常的明显,这是因为,图中有很多的硬币因为反光的缘故,导致主体部分有些发白,如图1-3所示。
3 灰度调整
对于这些发白部分,我们采用灰度调整及中值滤波进行处理,在matlab中,提供了两个函数进行相应的操作,其中imadjust进行灰度调整,其用法如下
Imadjst(f,[low_in high_in],[low_out high_out],gamma)
Gamma所表示的意义:
1 -------- 凹曲线
<1 -------- 凸直线
=1 -------- 直线
medfilt2用于进行中值滤波处理,其用法如下
F=medfilt2(f,[m n]);
f为输入图像
[m n]为中值滤波模板
F是中值滤波后输出的图像。
图4-1经过灰度调整及中值滤波后的图像如图1-4所示,可见,经过中值滤波后,硬币的主体部分有了较大的改善。
4 二值化处理
经过滤波后,即可对图像进行二值化处理,首先,我们采用人工选择阈值的方法进行二值化,由图可见,对于本幅图片,其合适的阈值在50~100之间,通过试验,我们选取的值为80。
对图像二值化处理的程序如下:
[M,N]=size(F);
for x=1:M
for y=1:N
if F(x,y)<80
F(x,y)=0; %低于阈值的值黑
else
F(x,y)=255; %高于阈值的值白
end
end
end
处理后的图像如图1-6所示:
5 阈值分割
当然仍有许多模糊的硬币管脚残影,但已经将硬币的主体很好的识别了出来,采用人工选择阈值的方法虽然可以成功分离出硬币的主体,但是这个阈值这是针对这张图片有效,对于获取的其它图片,这个阈值并不能正确地对图像进行二值化处理,因此我们决定采用自动阈值分割的方法来对图像进行二值化。
我们所选用的自动阈值分割方法为Otsu法,它是一种使类间方差最大的自动确定阈值的方法,该方法具有简单、处理速度快的特点,是一种常用的阈值选取方法。
在matlab中,提供了一个函数graythresh来实现Otsu法阈值分割,其用法如下:
T=graythresh(f);
其中,f为待进行阈值分割的灰度图像,T为返回的分割灰度比例,将其乘于256即为Otsu法划定的分割阈值。
优化后的程序如下:
T=graythresh(F);
由图中可见,噪声被有效的滤除了,但是,去除了噪声的同时,也使部分接触紧密的硬币在闭运算后可能连成一个整体,如图1-8中的红圈所示,因此在此后的识别统计中需要对其进行特殊的处理。
⛄二、部分源代码
clear all;
close all;
f=imread(‘yingbi2.jpg’);
w=imshow(f);title(‘原图像’);
F=rgb2gray(f); %真彩图转化为灰度图
figure;imshow(F);title(‘灰度图’);
figure;imhist(F);title(‘直方图’);
F0 = imadjust(F,stretchlim(F),[0 1]);
Ft=medfilt2(F0,[5 5]);
figure;imshow(Ft);title(‘灰度调整,中值滤波后的图像’);
figure;imhist(Ft);title(‘灰度调整,中值滤波后的直方图’);
T=graythresh(Ft);
T=T*256-5;
[M,N]=size(Ft);
for x=1:M
for y=1:N
if Ft(x,y)<T
Ft(x,y)=0; %低于阈值的值黑
else
Ft(x,y)=255; %高于阈值的值白
end
end
end
figure;imshow(Ft);title(‘二值化结果’);
B=ones(10);
F0=imclose(Ft,B);
figure;imshow(F0);title(‘闭运算’);
F1=imadjust(F0,[0,1],[1,0],1);
figure;imshow(F1);title(‘反色’);
%对图像贴标签
[L N]=bwlabel(F1,8)
Sum = [];
%统计每个标签的数量,有些硬币可能会重叠在一起的情况一定要用此种方法
for i=1:N
[r,c] = find(L==i);
rc = [r c];
Num = length(rc);
Sum([i])=Num;
end
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1]朱俊达.硬币分拣机的分拣与计数[J].技术与市场. 2018,25(02)
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除