前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android开发笔记(一百五十)自动识别验证码图片

Android开发笔记(一百五十)自动识别验证码图片

作者头像
aqi00
发布2019-01-18 15:17:15
1.3K0
发布2019-01-18 15:17:15
举报
文章被收录于专栏:老欧说安卓

若问目前IT领域最炙手可热的技术方向,必属人工智能(简称AI)无疑。前有谷歌的阿法狗完胜围棋世界冠军柯洁,后有微软小冰出版了诗集《阳光失了玻璃窗》,一时间沸沸扬扬,似乎人工智能无所不能,从而掀起了人民大众了解和关注AI的大潮。 虽然人工智能看起来仿佛刚刚兴起,但是它的相关产品早已普遍应用,在工业制造领域,有越来越多的机器人用于自动化生产;在家庭生活领域,则有智能锁、扫地机器人等助力智能家居。这些智能产品的背后,离不开人工智能的几项基本技术,包括计算机视觉、自然语言处理、数据挖掘与分析等等。这几项技术的应用说明如下: 1、计算机视觉,包括图像识别,视频识别等技术,可应用于指纹识别、人脸识别、无人驾驶汽车等等; 2、自然语言处理,包括音频识别、语义分析等技术,可应用于机器翻译、语音速记、信息检索等等; 3、数据挖掘与分析,包括大数据的相关处理技术,可应用于商品推荐、天气预报、红绿灯优化等等; 上述的几个人工智能应用,看似牛逼,可是这跟Android开发有什么关系呢?其实手机App很早就用上了相关的智能技术,还记得12306网站的神奇验证码吧,买张热点地区的火车票一直是个老大难,常常在火车站售票窗口排了许久的队伍,终于排到你的时候却发现目的地的火车票卖光了。特别是春运的时候,即使不到售票窗口排队,而是到12306网站买票,也常常因为各种操作问题贻误下单,于是各种抢票插件应运而生,帮助用户自动登录、自动选择乘车日期和起止站点、自动下单抢票。抢票插件的核心功能之一,便是自动识别登录过程中的验证码图片,原本这个验证码图片是用来阻止程序自动登录的,然而道高一尺魔高一丈,任你采取图片验证码又如何,抢票插件照样能够识别出图片所呈现出来的形状。注意,这里提到的识别图片中的验证码,即为人工智能的一项初级应用。 验证码图片识别,最简单的是数字验证码,因为数字只有从0到9一共十个字符,并且每个数字的形状也比较简单,所以本文就从数字验证码的识别着手,拨开高大上的迷雾,谈谈人工智能的初级应用。 先来看看一张再普通不过的验证码图片:

这张验证码图片蕴含的数字串为8342,拿到该图片,接下来要进行以下步骤的处理: 首先对该图片进行裁剪操作,去掉外围的空白区域,把每个数字所处的区域单独抠出来。如下图所示,四个数字被红框圈出了四段图片:

然后对每个数字方块再做切割,一般是按照九宫格切为九块,分别是左上角、正上方、右上角、正左边、中央、正右边、左下角、正下方、右下角,切割后的效果如下图所示:

之所以把数字方块切成九块,是因为每个数字的形状在不同方位各有侧重点,比如数字3在正左边是空白的,而数字8的正左边有线条;又比如数字6在右上角空白、在右下角有线条,而数字9在右上角有线条、在右下角空白。分别判断九个方位上的线条像素,即可筛选符合条件的数字,进而推断出最可能的数字字符。 一般情况下,图片中的数字颜色较深,其它区域颜色较浅,通过判断每个方格上的像素点颜色深浅,就能得知该方格是否有线条经过。获取像素点的颜色深浅主要有以下几个步骤: 1、调用Bitmap对象的getPixel,获得指定xy坐标的像素点,代码如下:

代码语言:javascript
复制
Color color = bitmap.getPixel(x, y);

2、调用Integer类的toHexString方法,把Color对象转换为String对象,代码如下:

代码语言:javascript
复制
String colorStr = Integer.toHexString(color);

3、第2步得到的String对象是个长度为8的字符串,其中前两位表示透明度,3到4位表示红色浓度,5到6位表示绿色浓度,7到8位表示蓝色浓度,另外需要把16进制的颜色浓度转换为10进制的浓度数值,示例代码如下:

代码语言:javascript
复制
	public static int getRed(String colorStr) {
		return Integer.parseInt(colorStr.substring(2, 4), 16);
	}

	public static int getGreen(String colorStr) {
		return Integer.parseInt(colorStr.substring(4, 6), 16);
	}

	public static int getBlue(String colorStr) {
		return Integer.parseInt(colorStr.substring(6, 8), 16);
	}

下面列举几个识别验证码的效果图,第一张是浅色背景的验证码图片,由于数字整齐故而识别成功率很高:

第二张是深色背景的验证码图片,经过调节颜色的深浅对比度,识别成功率也很高:

最后一张的验证码图片不那么整齐了,每个数字都有三种对齐方式,分别是立正、向左倾斜、向右倾斜,此时数字识别难度加大,原先的算法识别成功率不高,需要加以优化:

点此查看Android开发笔记的完整目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年09月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
验证码
腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档