验证码是别过程:
阅读(114) | 评论(2) | 转发(0) |
- 将图像从jpg等格式转换为位图便于处理,方法在上一篇文章中讲过了。
- 去除干扰素:<a>线条的:检查该线条是否贯通的直线条,如果是则去掉,<b>点:检查该点是否是孤立的,如果是则去掉。
- 图像灰度化-中值滤波等,同时可以实现背景的去除。
- .二值化:一般图片都是彩色的,按照逼真程度,可能很多级别。为了降低计算复杂度,方便后续的处理,如果在不损失关键信息的情况下,能将图片处理成黑白两种颜色,那就最好不过了。
- .细化:找出图像的骨架,图像线条可能是很宽的,通过细化将宽度将为1,某些地方可能大于1。不同的细化算法,可能有不同的差异,比如是否更靠近线条中间,比如是否保持联通行等。
- .边缘检测:主要是理解边缘的概念。边缘实际上是图像中图像像素属性变化剧烈的地方。可能通过一个固定的门限值来判断,也可能是自适应的。门限可能是图像全局的,也可能是局部的。不能说那个就一定好,不过大部分时候,自适应的局部的门限可能要好点。被分析的,可能是颜色,也可能是灰度图像的灰度。
- 图片分割和识别.
需要提醒的是:bmp图片在扫描行所占的字节数是4的倍数,不足的以0填充,在读取像数值是要注意你的图片每行是否有填充的0,有的话也要读入但不计算,不然,当把图片灰度化后,像素存入图片,图片会错乱。。。。。
图像二值化的意思就是将图像的有效点给分离出来,然后将图片用0和1两个值进行表示,因为我们没必要知道他们的具体色值,我们的目的就是要知道他们的具体形状,他们的特征.
而二值化的关键就在于找一个合适的阈(yu)值,找阈值的算法很多,比如大津法,OSTU分水岭算法等等,但有时这些算法算出的阈值也不一定准确,还有一种方法就是自定义阈值,进行比试,进而找到一个满意的阈值,bmp 图片一般像素值越小,颜色越黑。二值化的思想是什么呢?其实,二值化就是把小于这阈值的像素全设为0,而大于此阈值的像素设为255,二值化后的图片效果
。
![](/attachment/201211/28/28308371_1354091704neNc.jpg)
图片分割,每个人都有自己的分割方法,大体的就是求出每个字符的高度和宽度范围,这里就不多说了。
验证码识别:(方法:特征向量法)
1.(建两个模板)第一个模板,把每个字符的像素保存在一个二维数组中,的二个模板,把与第一模板相同的字符像素也保存在二维数组中,与一模板不同的是,@每个字符从上到下,从左到右,依次寻找,如果这一行有多个黑像素值(0)相邻,就记一个1,接着如果遇见多个白色像素值(255)相邻,但就记一个0,就这样每行进行计算#//,每个字符都这样计算,最后得到两个模板, ($$) 接着读图片字符,先把读入的一个字符与一模板第一个字符的像素值进行一对一比较,算出相同位置上的1的个数num1,再与二模板第一个二维数组进行逐行逐数比较,算出这个二维数组中相同的行数num2(读入的字符也执行@~#//),num3[i] = num1 * num2;重复执行($$)后的算法,最后得到 i 个num3;然后找出这i个num3中最大值的下标,此下标对应的字符就为识别字符,最后,仍有几个没识别,可特意把它加进模板中。
2.(建立一个模板):欧式距离法,将一个字符都放在16*16(是因为我这图片中字符宽和长都接近16)的矩阵中,可将这16*16的矩阵看作16个4*4的矩阵,你也可以定义其他大小的矩阵,但是,一定要能分成m个 n * n的小矩阵。然后,分别计算这16个4*4小矩阵中黑像素的个数num1,这样就能得到16个特征向量,为了提高识别精确度,再找其他图片上同一字符,算出特征量,这样一个字符就会有多组不同的特征量组,然后,把各组特征向量对应求平均值,就会得到一个平均特征向量组,并把它保存成模板,依照上面的做法就能得到所有字符的模板库,之后,就读子符匹配识别,这里就用到“欧几里德距离公式算法”;
欧氏距离的公式
d=sqrt( ∑(xi1-xi2)^2 ) 这里i=1,2..n
xi1表示第一个点的第i维坐标,xi2表示第二个点的第i维坐标
n维欧氏空间是一个点集,它的每个点可以表示为(x(1),x(2),...x(n)),其中x(i)(i=1,2...n)是实数,称为x的第i个坐标,两个点x和y=(y(1),y(2)...y(n))之间的距离d(x,y)定义为上面的公式.
相关热门文章
评论热议