国际标准书号。这个号码印刷在每本图书封底(或护封)的右下角,由一组用四个分割
线“-”隔开的 13 个数字。例如:ISBN 978-7-111-47818-8。其中, ISBN987 代表是中国,7 代表分类,111代表出版社编号,47818 代表本书在出版社所有出版书中的编号,9 是校验码,即:用 1 分别乘 ISBN 的前12 位中的奇数位,用 3 乘以偶数位,乘积之和以 10 为模,用 10 减去此模,即可得到校验位的值,其值范围为 0-9。例S=9* 1+7 * 3+8 * 1+7 * 3+1 * 1+1 * 3+1 * 1+4 * 3+ 7 * 1+8 * 3+1 * 1+ 8 * 3=132,132%10=2,10-2=8,因此校验码即为 8。在该码的下方有一个条形码,条形码的下方写着 13 个数字,与 ISBN 后面的数字是相同的
输入图像
-
用OpenCV函数读入图像
彩色图为一个三维数组,灰度图为二维数组
图像文件在计算机中存储的都是每一个像素对应的颜色值,由RGB三通道颜色空间合成,通俗来讲就是将三个分别只有==R(red),G(green),B(blue)==的矩阵叠加而成,R.G.B为三个二维数组,数组值为0-255 -
图像类别:
(1)24位真彩色图像:三维数组表示
(2)8位灰度图:二维数组,一位要么是1要么是0,0-1表示256中状态,需要8位
(3)1位黑白图(二值图),0-黑色 1-白色
灰度化处理
- 将 24 真彩色图转换为灰度图像
在自然界中,颜色本身非常容易受到光照的影响,RGB变化很大。因此,在进行图像处理之前,至关重要的一步就是将图像转化为灰度图。对于彩色转灰度,共有三种方式式:
Gray = R* 0.299 + G* 0.587 + B*0.114(加权法)
Gray = (R+G+B)/3(平均法)
Gray=max(R,G,B)(即找出三者的最大值) - 作出该图的灰度直方图
把图片中每一个像素出现的次数统计出来。请根据给出的灰度值矩阵统计出此图的灰度直方图,即统计每一个灰度值出现的频数,灰度直方图是反映一幅图片中各灰度级像素出现的频率与灰度级之间的关系
去噪处理
- 中值滤波
在处理图像时,由于噪声的影响处理识别的效果并不是很好。为了尽可能保存图像原
本信息,我们需要在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。中值滤波采
用非线性的方法,它在平滑脉冲噪声方面非常有效,同时它可以保护图像尖锐的边缘,选择
适当的点来替代污染点的值,所以处理效果好。对一个图像的像素值 N 行 M 列的矩阵,我
们保留其边缘像素值,对于其他数值,我们取以它中心的 3*3 矩阵,里面有 9 个像素点,
我们将 9 个像素进行排序,最后将这个矩阵的中心点赋值为这九个像素的中值。并对赋值
后的矩阵继续进行下一像素的运算,直至全部完成。
二值化处理
- 找最小的值做图像分割
对ISBN号图像进行一系列处理之后,我们要将图像中的ISBN号与背景分离开来,以便于下一步对ISBN号进行分割的处理。对一幅图像进行分割,是利用图像要提取的目标与背景在灰度上的差异,通过设置阈值来将像素级分成若干
类,从而实现目标与背景分离。 - 标识每一个数字图元区域
给出一幅二值图图片,即图像的亮度值只有两个状态:0 和 1,接下来就可以进行连通区域的分析了,也就是说它通过对白色像素(目标)的标记,让每个单独的点形成一个被标识的连通区域,在此过程中,常见的寻找连通区域的方法为 4 邻域和 8 邻域,4 邻域包含上下左右四个点,8 邻域包含上下左右及对角线总共八个顶点,若顶点的图像亮度值相同,认为它们可以形成一个区域,标注为同一个数字,以此类推,找到所有的图元区域。
倾斜图像修正
截取 ISBN 号所在行
字符分割处理
- 做垂直投影
- 提取每一个数字的最小平行外接矩形
在对 ISBN 图像进行识别时,通过对 ISBN 序列进行垂直投影,即对 ISBN 字
符区域进行从左到右的扫描,依次检测每一个坐标的投影数值,当我们发现像
素值为 1 的点时,我们就认为找到一个字符的左边界,继续向右扫描到最后一
个像素值为 1 的点时,我们就认为找到了一个字符的右边界。对每一个垂直投
影得到的字符区域,我们再进行水平投影,得到一个最小的外接矩形区域。
字符识别处理
- 数字图像尺寸归一化:将图像调整到同样大小
最近邻插值法:
即定义左上角第一个像素值坐标为(0,0),横轴向右,纵轴向下,例如原图像为 m 行 n 列,我们要实现的统一的图像大小为 p 行 q 列,则在新图像中坐标为(x,y)的像素值为原图像坐标为(x*(m/p),y*(n/q))对应的值(小数则向下取整)。 - 再进行模板识别,将模板用二维数组装起来,然后再逐一比对
某些可以使用的函数
- 灰度、二值化处理
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
_,binary = cv.threshold(gray,0,255,cv.THRESH_OTSU)
#cv.imshow("binary",binary)