本文通过分析第五版人民币的特征,利用纸币中央数字的特征提取和识别的方法,通过matlab软件实现对第五版人民币的100元、50元和20元的识别。
- Matlab函数介绍
- Imread
函数imread用于读取图片文件中的数据。
调用格式:
A = imread(filename,fmt)
[X,map] = imread(filename,fmt)
[...] = imread(filename)
- Imshow
imshow是matlab中显示图像的函数。
调用格式:
imshow(BW):显示一张二值图像BW
imshow(RGB):显示一张真彩色图像RGB
imshow(X,map):用指定调色板来显示图像
- im2bw
matlab中DIP工具箱函数im2bw使用阈值(threshold)变换法把灰度图像(grayscale image)转换成二值图像。一般意义上是指只有纯黑(0)、纯白(255)两种颜色的图像。 当然, 也可以是其他任意两种颜色的组合。所谓二值图像, 一般意义上是指只有纯黑(0)、纯白(255)两种颜色的图像。 当然, 也可以是其他任意两种颜色的组合。
调用格式:
BW = im2bw(I, level)
BW = im2bw(X, map, level)
BW = im2bw(RGB, level)
其中level就是设置阈值的。level取值范围[0, 1]。
- Imfill
该函数用于填充图像区域和“空洞”。
调用格式:
BW2 = imfill(BW)
这种格式将一张二值图像显示在屏幕上, 允许用户使用鼠标在图像上点几个点, 这几个点围成的区域即要填充的区域。要以这种交互方式操作, BW必须是一个二维的图像。用户可以通过按Backspace键或者Delete键来取消之前选择的区域;通过shift+鼠标左键单击或者鼠标右键单击或双击可以确定选择区域。
[BW2,locations] = imfill(BW)
这种方式, 将返回用户的取样点索引值。注意这里索引值不是选取样点的坐标。
BW2 = imfill(BW,locations)
这种格式允许用户编程时指定选取样点的索引。locations是个多维数组时, 数组每一行指定一个区域。
BW2 = imfill(BW,'holes')
填充二值图像中的空洞区域。 如, 黑色的背景上有个白色的圆圈。 则这个圆圈内区域将被填充。
I2 = imfill(I)
这种调用格式将填充灰度图像中所有的空洞区域。
BW2 = imfill(BW,locations,conn)
- Bwperim
用于查找二值图像的边缘。
调用格式:
BW2 = bwperim(BW1)
BW2 = bwperim(BW1,conn)
BW2 = bwperim(BW1,conn)
表示从输入图像BW1中返回只包括对象边缘像素点的图像。
- Mode
众数函数,用于计算一组数据中的众数。
众数,简单的说,就是一组数据中占比例最多的那个数。
调用格式:
mode(x)
- medfilt2
中值滤波函数.
调用格式:
medfilt2(A,[m n])
- Logical
用于判断参数是否为逻辑值,如果检验内容为逻辑值,将返回TRUE(1),否则返回FALSE(0)。
调用格式:
Logical(value)
- Find
用来对原始数据中的某个字符串进行定位,以确定其位置。
- edge
调用格式:
BW=edge(I)
采用灰度或一个二值化图像I作为它的输入,并返回一个与I相同大小的二值化图像BW,在函数检测到边缘的地方为1,其他地方为0.
BW=edge(I,’sobel’)
自动选择阈值用sobel算子进行边缘检测。
算子还有roberts算子,prewitt算子,log算子等等。
- 流程各部分详细说明
读入待检测图片
Im=imread(‘100.jpg’);
figure(1)
imshow(Im);
读入一张有黑色背景的100元人民币图片。然后使用imshow函数进行图片查看。
- 进行图像边缘检测提取
边缘检测共有两种方法,一种是使用edge函数进行边缘检测;另一种是二值化+图像填充+提取边缘的方法。
使用edge函数进行边缘检测,选择Sobel算子。
F=edge(I2,'sobel');%sobel算子边缘检测
figure(2)
imshow(F)
如图,sobel算子边缘检测后的图像。达到需要的效果。但是由于内部白色纹路较多,为了不影响边缘截取,故选择第二种方法:二值化+图像填充+提取边缘。
首先对图像进行二值化处理,然后使用imfill函数,调用“hole”格式,对图像中的空洞进行填充。然后调用bwperim函数,对二值图像进行边缘检测。下面是检测的过程和结果。