2013-03-01 11:03:33 UnilVision 阅读数 3729
  • PHP7字符串模块

    King老师精心打造的PHP7字符串实战课程,由浅入深的讲解了PHP中字符串模块,并介绍了一些常用的字符串相关操作,让我们一起开启字符串之旅吧~ 山哥出品,必属精品!

    15574 人正在学习 去看看 何山

本文介绍3种基本的字符形状归一化算法(Character Shape Normalization)。字符归一化是光学字符识别中的一个子步骤,给定一个字符区域,我们要做的就是将该区域内的字符归一化到一个标准模板大小,然后才能提取特征,并送给分类器做具体的识别。好的归一化算法可以尽量提高后续特征提取在同一类内的一致性。

先来看一个例子,假如上帝拥有一个完美的字符归一化算法,那么他将可以做到如下所示的效果:

图1,完美的归一化:左边为原始字符区域,右边为归一化后的结果。

如果说我们能做到上述结果,那么也就无需再做特征提取,也无需再做训练,而只需简单的模板匹配即可得到100%准确的分类结果。可以看到,上述算法的能力在于:

1. 归一化到标准模板大小

2. 倾斜校正

3. 笔画宽度归一化

4. 字形归一化


可惜的是,今天介绍的几种常见算法仅能保证第1点的实现,而2,3则只能实现部分。至于4,就让后续的特征提取去弥补吧。言归正传,3个算法分别是:线性归一化算法,基于图像矩的归一化以及非线性归一化算法。


按惯例,3个算法的标准c实现可在:

https://github.com/UnilVision/visionbase/tree/master/ocr/baseline/normalization找到。希望对大家有所帮助。


线性归一化:线性归一化算法就是一个标准的线性采样过程,采用线性插值获得最终的图像结果。在我们的实现中,使用反向计算的方式:

其中为长和宽的比值。

对应代码中的函数为:

void backward_linear(unsigned char* src, int src_wid, int src_hei, int src_widstep,
					 CHARECT_t* region,
					 unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
					 int ratio_preserve_func);

图像矩归一化: 我们可以通过图像矩来预先校正字符的倾斜度,并通过矩来获得字体的实际大小[w1, h1]及中心位置[xc, yc]。归一化的原始区域被修改为

[xc-w1/2, xc+w1/2, yc-h1/2, yc+h1/2]。其计算方法为:


是一个经验值,一般取4。


其中图像矩的计算方法:



在找到新的区域[xc-w1/2, xc+w1/2, yc-h1/2, yc+h1/2]后,后续即调用线性归一化算法即可。对应代码中的实现为:

void backward_moment(unsigned char* src, int src_wid, int src_hei, int src_widstep,
					 CHARECT_t* region,
					 unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
					 int ratio_preserve_func);


图像矩倾斜校正:利用图像矩,我们可以找到字符的倾斜角

采样计算方式为:


注意这里我们仅调整x的位置以保证图像的中心仍然处于原始的xc,yc。其实现对于:

// slant correction
// Note>> (dst_wid, dst_hei) must equal to (region.width, region.height)
void backward_moment_slantcorrection(unsigned char* src, int src_wid, int src_hei, int src_widstep,
				     CHARECT_t* region,
				     unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep);

通常倾斜校正会放在归一化之前,已获得更好的效果。


非线性归一化:这里实现的是Jun Tsukumo在1988年提出的一个经典算法(原论文名称为Classification of Handprinted Chinese Characters Using Non-linear Normalization and Correlation Methods)。作者的思路是希望每一行,每一列的背景区域都可以平均分布。

为此,他首先为每个像素在x,y方向分别定义了个概率密度函数:以及。这两个函数的计算方法是:

如果(x,y)是一个属于字符区域的像素,那么都取一个极小值(在我们的实现中,这个值是0.001f,调整这个参数可以引起归一化后笔画的粗细变化)。

如果(x,y)是背景区域像素,那么:



其中分别是当前像素所处x方向背景像素的run-length和y方向的run-length。有了这两个密度函数,定义:



这里px和py就是归一化后的投影直方图了,为了在归一化后的图像中让px和py平均分布,引入两个函数hx,hy:



通过前向映射采样即可实现归一化操作:



注意这里与前两个算法的不同之处,前向映射是将当前图像的某个像素映射到归一化的图像中。而反向映射则是将归一化的图像中的某个像素位置映射到原图像中。

非线性归一化的实现对应:

void forward_nonlinear_1d(unsigned char* src, int src_wid, int src_hei, int src_widstep,
						  CHARECT_t* region,
						  unsigned char* dst, int dst_wid, int dst_hei, int dst_widstep,
						  int ratio_preserve_func);

参考结果

最后看下各个算法的结果:


图2,参考结果。从左到右依次:1. 原始扣取的图像通过OpenCV的resize函数缩放。2. 线性归一化。3.基于矩的归一化。4.先倾斜校正再基于矩的归一化。5.非线性归一化。


[原创文章,转载请注明出处:http://blog.csdn.net/unilvision/article/details/8624606]




2015-11-08 10:47:21 s12244315 阅读数 6356
  • PHP7字符串模块

    King老师精心打造的PHP7字符串实战课程,由浅入深的讲解了PHP中字符串模块,并介绍了一些常用的字符串相关操作,让我们一起开启字符串之旅吧~ 山哥出品,必属精品!

    15574 人正在学习 去看看 何山

      扫描图像中的数字字符可能大小不一,而后续ANN的训练和识别都需要同一尺寸的字符对象,因此有必要对字符进行归一化处理,使其具有相同的尺寸。

代码如下:

/****************************************************************
功能:    字符归一化
参数:    img:有待归一化的图像
          dst:归一化后目标图像
	  int nTargWidth:归一化的目标宽度
	  int nTargHeight:归一化的目标高度
	  RECT lpRect:等待缩放的矩形框
注    :  只能处理二值图像
返回值:  缩放后的矩形框
***************************************************************/
RECT  Ctry::RgnZoom(IplImage* img, IplImage* dst, int nTargWidth, int nTargHeight, RECT lpRect)
{
	RECT retRT;   //缩放后的区域矩形
	double dXScale;   //水平方向缩放因子
	double dYScale;   //竖直方法缩放因子

    //确定缩放系数
	dXScale = (double)nTargWidth / (lpRect.right - lpRect.left + 1);
	dYScale = (double)nTargHeight / (lpRect.bottom - lpRect.top + 1);

	int nSrc_i, nSrc_j;   //映射源坐标

	retRT.top = lpRect.top;
	retRT.bottom = retRT.top + nTargHeight;
	retRT.left = lpRect.left;
	retRT.right = retRT.left + nTargWidth;

   //对图像的区域矩形进行逐行扫描,通过像素映射完成缩放
	for (int  i = retRT.top; i < retRT.bottom; i++)
	{
		for (int j = retRT.left; j < retRT.right; j++)
		{
			//计算映射的源坐标(最邻近插值)
			nSrc_i = retRT.top + int((i - retRT.top) / dYScale);
			nSrc_j = retRT.left + int((j - retRT.left) / dXScale);

			//对应像素赋值
			double pixel = cvGetReal2D(img, nSrc_i, nSrc_j);
			cvSetReal2D(dst, i, j, pixel);
		}
	}
	return retRT;
}
在上一篇博客文章《中字符分割二》中得到矩形框,然后调用此函数,完整代码如下:

void Ctry::ObjectNorm()
{
	// TODO:  在此添加命令处理程序代码    
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\dst.jpg", -1);
	vector<RECT>  vecRECTBig;
	vecRECTBig = ObjectSegment(img, 260);//该函数见上一篇博客《字符分割二》

	IplImage *norm = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	for (int i = 0; i < norm->height; i++)
	{
		for (int j = 0; j < norm->width; j++)
		{
			cvSetReal2D(norm, i, j, 255);
		}
	}
	for (int i = 0; i < vecRECTBig.size(); i++)
	{
		RECT rt = vecRECTBig[i];    //取得一个矩形轮廓
		vecRECTBig[i] = RgnZoom(img, norm, 60, 100, rt);

		int x = vecRECTBig[i].left - 1;
		int y = vecRECTBig[i].top - 1;
		int x1 = vecRECTBig[i].right + 1;
		int y1 = vecRECTBig[i].bottom + 1;
		CvPoint pt1(x, y);
		CvPoint pt2(x1, y1);
		cvRectangle(norm, pt1, pt2, CV_RGB(255, 0, 0), 1);
	}
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\norm.jpg", norm);
}


效果图:

原图:



2016-04-19 15:32:00 weixin_30652491 阅读数 9
  • PHP7字符串模块

    King老师精心打造的PHP7字符串实战课程,由浅入深的讲解了PHP中字符串模块,并介绍了一些常用的字符串相关操作,让我们一起开启字符串之旅吧~ 山哥出品,必属精品!

    15574 人正在学习 去看看 何山

图像预处理第7步:标准归一化
将分割出来的各个不同宽、高的数字字符宽、高统一

//图像预处理第7步:标准归一化
//将分割出来的各个不同宽、高的数字字符宽、高统一
void CChildView::OnImgprcStandarize() 
{
    StdDIBbyRect(m_hDIB,w_sample,h_sample);
    //在屏幕上显示位图
    CDC* pDC=GetDC();
    DisplayDIB(pDC,m_hDIB);    
    DrawFrame(pDC,m_hDIB,m_charRect,2,RGB(21,255,25));
    gyhfinished=true;
}
/******************************************************************
*
*  函数名称:
*      StdDIBbyRect()
*
*  参数:
*     HDIB  hDIB          -图像的句柄
*     int   tarWidth      -标准化的宽度
*     int   tarHeight     -标准化的高度
*
*  返回值:
*         无
*
*  功能:
*     将经过分割的字符,进行缩放处理使他们的宽和高一直,以方便特征的提取
*
*  说明:
*     函数中用到了,每个字符的位置信息,所以必须在执行完分割操作之后才能执行标准化操作
*
******************************************************************/
void StdDIBbyRect(HDIB hDIB, int tarWidth, int tarHeight)
{    

    //指向图像的指针
    BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)hDIB);

    //指向象素起始位置的指针
    BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB);
    
    //指向象素的指针
    BYTE* lpSrc;

    //获取图像的的宽度
    LONG lWidth=::DIBWidth ((char*)lpDIB);

    //获取图像的高度
    LONG lHeight=::DIBHeight ((char*)lpDIB);

    // 循环变量
    int    i;
    int    j;
    
    // 图像每行的字节数
    LONG    lLineBytes = WIDTHBYTES(lWidth * 8);

    //宽度、高度方向上的缩放因子
    double wscale,hscale;

    //开辟一块临时缓存区,来存放变化后的图像信息
    LPSTR lpNewDIBBits;
    LPSTR lpDst;
 
    //缓存区的大小和原图像的数据区大小一样
    HLOCAL nNewDIBBits=LocalAlloc(LHND,lLineBytes*lHeight);

    //指向缓存区开始位置的指针
    lpNewDIBBits=(char*)LocalLock(nNewDIBBits);

    //指向缓存内信息的指针
    lpDst=(char*)lpNewDIBBits;

    //将缓存区的内容赋初始值
    memset(lpDst,(BYTE)255,lLineBytes*lHeight);

    //进行映射操作的坐标变量
    int i_src,j_src;

    //存放字符位置信息的结构体
    CRect rect;
    CRect rectnew;

    //先清空一个新的矩形区域链表以便存储标准化后的矩形区域链表
    m_charRectCopy.clear ();

    //从头到尾逐个扫描各个结点
    while(!m_charRect.empty())
    {
        //从表头上得到一个矩形
        rect= m_charRect.front();

        //从链表头上面删掉一个
        m_charRect.pop_front();

        //计算缩放因子

        //横坐标方向的缩放因子
        wscale=(double)tarWidth/rect.Width ();

        //纵坐标方向的缩放因子
        hscale=(double)tarHeight/rect.Height ();

        //计算标准化矩形

        //上边界
        rectnew.top =rect.top ;

        //下边界
        rectnew.bottom =rect.top +tarHeight;

        //左边界
        rectnew.left =rect.left ;

        //右边界
        rectnew.right =rectnew.left +tarWidth;

        //将原矩形框内的象素映射到新的矩形框内
        for(i=rectnew.top ;i<rectnew.bottom ;i++)
        {
            for(j=rectnew.left ;j<rectnew.right ;j++)
            {   

                //计算映射坐标
                i_src=rectnew.top +int((i-rectnew.top )/hscale);
                j_src=rectnew.left +int((j-rectnew.left )/wscale);

                //将相对应的象素点进行映射操作
                lpSrc=(unsigned char *)lpDIBBits + lLineBytes *  i_src + j_src;
                lpDst = (char *)lpNewDIBBits + lLineBytes * i + j;
                *lpDst=*lpSrc;
            }
        }
        //将标准化后的矩形区域插入新的链表
        m_charRectCopy.push_back (rectnew);

    
    }

    //存储标准化后新的rect区域
    m_charRect=m_charRectCopy;

    //将缓存区的内容拷贝到图像的数据区内
    memcpy(lpDIBBits,lpNewDIBBits,lLineBytes*lHeight);

    //解除锁定
    ::GlobalUnlock ((HGLOBAL)hDIB);
}

运行效果:

转载于:https://www.cnblogs.com/Bobby0322/p/5408422.html

2017-09-11 22:16:27 linxid 阅读数 544
  • PHP7字符串模块

    King老师精心打造的PHP7字符串实战课程,由浅入深的讲解了PHP中字符串模块,并介绍了一些常用的字符串相关操作,让我们一起开启字符串之旅吧~ 山哥出品,必属精品!

    15574 人正在学习 去看看 何山

第二章

image.png

数据类

image.png
* double:使用最频繁,图像处理最常用
* logical:逻辑数据,只有0和1
* char:字符类,表示Unicode字符,一个字符串就是一个1*n的字符矩阵

2.6图像类型

四种图像类型:亮度图(灰度图),二值图,索引图,RGB图。
* 亮度图像:归一化取值表示亮度,若是unit8,则整数值范围是[0,255]。
* 二值图像:取值只有0和1的逻辑数组。
B = logical(A):A是0和1构成的数组,此语句创建数组B。若A中含有其他元素,则非零量为逻辑1。islogical( ) 判断一个数组是否为逻辑数组。
IPT中用于图像类和类型间的转换的函数
image.png

2.8数组索引

通过索引方案,简化数组操作,提高程序运行效率。

2.8.1向量索引

  • v = [1 3 5 7 9] :产生1,3,5,7,9的一个数组。v(2) = 3。维数为1*N的数组,行向量。
  • w = v.':可以将向量转置,(行向量变为列向量)。
  • v(1:3); v(2:4); v(3:end);:可以选取数组中相应的元素,end表示到最后。
    *v(:):将原向量(全部元素)变为一个列向量,按列的顺序进行排序。
    image.png
    v(1:end):产生一个行向量,依然按列的顺序展开。
    image.png
    • v(end:-2:1):从最后一个元素,步长为2,知道第一个元素
      v(1:2:end):与上相反
  • `linspace(a,b,n):以a和b为界限,线性分割的n个元素。
    image.png
  • v([1,4,5]):可以挑出向量v中的第1,4,5个元素。

2.8.2矩阵索引

  • A =[1 2 3;4 5 6;7 8 9] :创建矩阵;A(1,2):A矩阵的第一行,第二列元素。
  • c3 = A(:,3):第三列提取出来;r2 = A(2,:):第二行提取出来。T2 = A(1:2,1:3):矩阵前两行提出来。A(:,3) = 0:则令A矩阵的第三列为0;
  • A(end,end):最后一个元素;A(end,end - 2):类似。
  • A(2:end,end:-2:1):注意列的读取顺序发生了变化。
    image.png
    E = A([a b],[c d]):挑出(行a,列c)(行a,列d)(行b,列c)(行b,列d)的元素。
  • 逻辑数组的寻址方法:
    D = logical([1 0 0 ;0 0 1;0 0 0]);
    A(D):得到D中不为0的相应元素,以列向量的形式呈现。
  • s = sum(A(:)):对A的所有元素求和。sum(A):对各列元素求和。

2.8.3选择数组的维数

  • size(A,1):给出数组的行数;size(A,2):给出数组的列数。

2.9一些重要的标准数组

  • zeros(M,N) : M*N大小的double类0矩阵(元素全是0);
  • ones(M,N):M*N的double类矩阵(元素全是1);
  • ture(M,N):M*N的logical类矩阵,元素全是1;
  • false(M,N):…元素全是0;
  • magic(M):M*M的矩阵,每行、每列以及对角线的元素和相等。
  • rand(M,N):M*N的矩阵,元素是正太分布的随机数,随机数的均值是1,方差是0.

2.10M函数编程简介

图像处理工具箱的一大特征就是对MATLAB环境的透明访问。

2.10.1M文件

  • M文件的函数组成部分为: 函数定义行,H1行,帮助文体,函数体,命令。

函数定义行的形式:function [outputs] = name(inputs)。

  • 例如,计算两幅图像的和与积:function [s,p] = sumprod(f,q)
    f,q是输入图像,s是和图像,p是积图像,function必须出现在左侧,输出必须在方括号内,输入必须在圆括号呢。
    无输出,则可无括号或等号。函数可在命令提示符处调用。

H1行:函数的说明文本,用于说明函数用途,提供M文件的重要摘要信息。输入 help function_name后最先出现的文本。
帮助文本:紧跟H1行后面,为函数提供注释或者在线帮助。
“%”后面看作函数注释行。
edit function_name:可打开文件并进行编辑。

2.10.2运算符

  • 算术运算符
    两类不同的运算符:矩阵运算符(线性代数的规则定义);数组运算符(可以逐个运算的执行),可用于多维数组。例如:
    A*B:表示传统意义的矩阵乘法;
    A.*B:表示数组成都,A和B是大小相同的数组。加减法无区分。

    数组和矩阵运算符:
    image.png
    IPT支持的图像算数函数:
    image.png

  • max和min函数:
    1.c = max(A):若A是一个向量返回其最大元素,若是一个矩阵,返回每列的最大值,返回一个行向量。
    2.c = max(A,B):返回和A,B相同的数组,由A,B的最大元素组成。
    3.c = max(A,[],dim):返回dim决定的行上的最大值。
    4.[c,i] = max(...):最大值存入c与第一种一样,索引存入i。
  • 关系运算符:对于向量和举行数组,必须维数相同,或者其中一个是标量(每一个元素和这个标量比较)。
    1.A,B为两个矩阵 ,则A==B:生成与A和B相同维度的逻辑数组,相同位置元素相同则为1,否则为0。
    2.A>=B:A的元素大于B的元素的为1,否则为0.
    逻辑运算符:& (And) ; | (Or) ; ~(Not);xor(异或);all;any
    1.and,or,not,xor(异或):对数组内部元素进行操作,与数电等所学相同。注意使用方法,例如:
    A&B ; A|B ; A~ ;xor(A,B).
    2.all:若一个向量中所有元素非零,返回1,否则返回0;
    any:若一个向量中存在元素非零,则返回1,否则返回0。all,any均是按列进行操作。
    逻辑运算函数
    image.png
    image.png
    一些重要变量和常量
    image.png
2015-10-04 11:11:53 Eddy_zheng 阅读数 26424
  • PHP7字符串模块

    King老师精心打造的PHP7字符串实战课程,由浅入深的讲解了PHP中字符串模块,并介绍了一些常用的字符串相关操作,让我们一起开启字符串之旅吧~ 山哥出品,必属精品!

    15574 人正在学习 去看看 何山

一、验证码识别的概念

机器识别图片主要的三个步骤为消去背景、切割字符、识别字符。而现有的字符验证码也针对这三个方面来设计强壮的验证码。

以下简图帮助大家理解验证码识别的流程:
这里写图片描述

二、处理流程

其中最为关键的就是好图像处理这一步了。图像处理功能模块包括图像的灰度化、二值化、离散噪声点的去除、倾斜度校正、字符的切割、图像的归一化等图像处理技术 。

1、 图像的灰度化
由于 256 色的位图的调色板内容比较复杂,使得图像处理的许多算法都没有办法展开,因此有必要对它进行灰度处理。所谓灰度图像就是图像的每一个像素的 R、G、B 分量的值是相等的。彩色图像的每个像素的 R、G、B 值是不相同的,所以显示出红绿蓝等各种颜色。灰度图像没有这些颜色差异,有的只是亮度上的不同。灰度值大的像素点比较亮(像素值最大为 255,为白色),反之比较暗(像素值最小为 0,为黑色)。图像灰度化有各种不同的算法,比较直接的一种就是给像素的 RGB 值各自一个加权系数,然后求和;同时还要对调色板表项进行相应的处理。

2、 图像的二值化
要注意的是,最后得到的结果一定要归一到 0-255 之内。因为这是每个字节表示
图像数据的极限。

3、 去噪
图像可能在生成、传输或者采集过程中夹带了噪声,去噪声是图像处理中常用的手法。通常去噪声用滤波的方法,比如中值滤波、均值滤波。但是那样的算法不适合用在处理字符这样目标狭长的图像中,因为在滤波的过程中很有可能会去掉字符本身的像素。

一个采用的是去除杂点的方法来进行去噪声处理的。具体算法如下:扫描整个图像,当发现一个黑色点的时候,就考察和该黑色点间接或者直接相连接的黑色点的个数有多少,如果大于一定的值,那就说明该点不是离散点,否则就是离散点,把它去掉。在考察相连的黑色点的时候用的是递归的方法。此处,我简单的用python实现了,大家可以参考以下。

#coding=utf-8
"""
creat time:2015.09.14
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image,ImageEnhance,ImageFilter

img_name = '2+.png'
#去除干扰线
im = Image.open(img_name)
#图像二值化
enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
data = im.getdata()
w,h = im.size
#im.show()
black_point = 0
for x in xrange(1,w-1):
    for y in xrange(1,h-1):
        mid_pixel = data[w*y+x] #中央像素点像素值
        if mid_pixel == 0: #找出上下左右四个方向像素点像素值
            top_pixel = data[w*(y-1)+x]
            left_pixel = data[w*y+(x-1)]
            down_pixel = data[w*(y+1)+x]
            right_pixel = data[w*y+(x+1)]

            #判断上下左右的黑色像素点总个数
            if top_pixel == 0:
                black_point += 1
            if left_pixel == 0:
                black_point += 1
            if down_pixel == 0:
                black_point += 1
            if right_pixel == 0:
                black_point += 1
            if black_point >= 3:
                im.putpixel((x,y),0)
            #print black_point
            black_point = 0
im.show()

原验证码:
这里写图片描述

处理后:这里写图片描述

4、分割
图像中一般会含有多个数字,识别的时候只能根据每个字符的特征来进行判断,所以还要进行字符切割的工作。这一步工作就是把图像中的字符独立的切割出来。

具体的算法如下:

第一步,先自下而上对图像进行逐行扫描直至遇到第一个黑色的像素点。记录下来。然后再自上而下对图像进行逐行扫描直至找到第一个黑色像素,这样就找到图像大致的高度范围。

第二步,在这个高度范围之内再自左向右逐列进行扫描,遇到第一个黑色像素时认为是字符切割的起始位置,然后继续扫描,直至遇到有一列中没有黑色像素,则认为这个字符切割结束,然后继续扫描,按照上述的方法一直扫描直至图像的最右端。这样就得到了每个字符的比较精确宽度范围。

第三步,在已知的每个字符比较精确的宽度范围内,按照第一步的方法,分别进行自上而下和自下而上的逐行扫描来获取每个字符精确的高度范围。

5、 图像的归一化
因为采集的图像中字符大小有可能存在较大的差异,或者是经过切割后的字符尺寸不统一,而相对来说,统一尺寸的字符识别的标准性更强,准确率自然也更高,归一化图像就是要把原来各不相同的字符统一到同一尺寸,在系统实现中是统一到同一高度,然后根据高度来调整字符的宽度。具体算法如下:先得到原来字符的高度,跟系统要求的高度做比较,得出要变换的系数,然后根据得到的系数求得变换后应有得宽度。在得到宽度和高度之后,把新图像里面的点按照插值的方法映射到原图像中。

不少人认为把每个字符图像归一化为 5×9 像素的二值图像是最理想的,因为图像的尺寸越小,识别速度就越高,网络训练也越快。而实际上,相对于要识别的字符图像, 5×9 像素图太小了。归一化后,图像信息丢失了很多,这时进行图像识别,准确率不高。实验证明,将字符图像归一化为 10×18 像素的二值图像是现实中是比较理想的,达到了识别速度快和识别准确率高的较好的平衡点。

三、识别

图像识别包括特征提取、样本训练和识别三大块内容。

验证码识别其中最为关键的就是去噪和分割,这对你的训练和识别的精度都有着很大的影响。这里只讲了大致的流程,其中每个细节都有很多工作要做,这里码字也很难讲清楚,大家可以以这个流程为主线,一步步的实现,最终也就能完成你的需求。

字符紧缩对齐

阅读数 703

没有更多推荐了,返回首页