若问目前IT领域最炙手可热的技术方向,必属人工智能(简称AI)无疑。前有谷歌的阿法狗完胜围棋世界冠军柯洁,后有微软小冰出版了诗集《阳光失了玻璃窗》,一时间沸沸扬扬,似乎人工智能无所不能,从而掀起了人民大众了解和关注AI的大潮。
虽然人工智能看起来仿佛刚刚兴起,但是它的相关产品早已普遍应用,在工业制造领域,有越来越多的机器人用于自动化生产;在家庭生活领域,则有智能锁、扫地机器人等助力智能家居。这些智能产品的背后,离不开人工智能的几项基本技术,包括计算机视觉、自然语言处理、数据挖掘与分析等等。这几项技术的应用说明如下:
1、计算机视觉,包括图像识别,视频识别等技术,可应用于指纹识别、人脸识别、无人驾驶汽车等等;
2、自然语言处理,包括音频识别、语义分析等技术,可应用于机器翻译、语音速记、信息检索等等;
3、数据挖掘与分析,包括大数据的相关处理技术,可应用于商品推荐、天气预报、红绿灯优化等等;
上述的几个人工智能应用,看似牛逼,可是这跟Android开发有什么关系呢?其实手机App很早就用上了相关的智能技术,还记得12306网站的神奇验证码吧,买张热点地区的火车票一直是个老大难,常常在火车站售票窗口排了许久的队伍,终于排到你的时候却发现目的地的火车票卖光了。特别是春运的时候,即使不到售票窗口排队,而是到12306网站买票,也常常因为各种操作问题贻误下单,于是各种抢票插件应运而生,帮助用户自动登录、自动选择乘车日期和起止站点、自动下单抢票。抢票插件的核心功能之一,便是自动识别登录过程中的验证码图片,原本这个验证码图片是用来阻止程序自动登录的,然而道高一尺魔高一丈,任你采取图片验证码又如何,抢票插件照样能够识别出图片所呈现出来的形状。注意,这里提到的识别图片中的验证码,即为人工智能的一项初级应用。
验证码图片识别,最简单的是数字验证码,因为数字只有从0到9一共十个字符,并且每个数字的形状也比较简单,所以本文就从数字验证码的识别着手,拨开高大上的迷雾,谈谈人工智能的初级应用。
先来看看一张再普通不过的验证码图片:
这张验证码图片蕴含的数字串为8342,拿到该图片,接下来要进行以下步骤的处理:
首先对该图片进行裁剪操作,去掉外围的空白区域,把每个数字所处的区域单独抠出来。如下图所示,四个数字被红框圈出了四段图片:
然后对每个数字方块再做切割,一般是按照九宫格切为九块,分别是左上角、正上方、右上角、正左边、中央、正右边、左下角、正下方、右下角,切割后的效果如下图所示:
之所以把数字方块切成九块,是因为每个数字的形状在不同方位各有侧重点,比如数字3在正左边是空白的,而数字8的正左边有线条;又比如数字6在右上角空白、在右下角有线条,而数字9在右上角有线条、在右下角空白。分别判断九个方位上的线条像素,即可筛选符合条件的数字,进而推断出最可能的数字字符。
一般情况下,图片中的数字颜色较深,其它区域颜色较浅,通过判断每个方格上的像素点颜色深浅,就能得知该方格是否有线条经过。获取像素点的颜色深浅主要有以下几个步骤:
1、调用Bitmap对象的getPixel,获得指定xy坐标的像素点,代码如下:
下面列举几个识别验证码的效果图,第一张是浅色背景的验证码图片,由于数字整齐故而识别成功率很高:
第二张是深色背景的验证码图片,经过调节颜色的深浅对比度,识别成功率也很高:
最后一张的验证码图片不那么整齐了,每个数字都有三种对齐方式,分别是立正、向左倾斜、向右倾斜,此时数字识别难度加大,原先的算法识别成功率不高,需要加以优化:
点此查看Android开发笔记的完整目录
__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。
虽然人工智能看起来仿佛刚刚兴起,但是它的相关产品早已普遍应用,在工业制造领域,有越来越多的机器人用于自动化生产;在家庭生活领域,则有智能锁、扫地机器人等助力智能家居。这些智能产品的背后,离不开人工智能的几项基本技术,包括计算机视觉、自然语言处理、数据挖掘与分析等等。这几项技术的应用说明如下:
1、计算机视觉,包括图像识别,视频识别等技术,可应用于指纹识别、人脸识别、无人驾驶汽车等等;
2、自然语言处理,包括音频识别、语义分析等技术,可应用于机器翻译、语音速记、信息检索等等;
3、数据挖掘与分析,包括大数据的相关处理技术,可应用于商品推荐、天气预报、红绿灯优化等等;
上述的几个人工智能应用,看似牛逼,可是这跟Android开发有什么关系呢?其实手机App很早就用上了相关的智能技术,还记得12306网站的神奇验证码吧,买张热点地区的火车票一直是个老大难,常常在火车站售票窗口排了许久的队伍,终于排到你的时候却发现目的地的火车票卖光了。特别是春运的时候,即使不到售票窗口排队,而是到12306网站买票,也常常因为各种操作问题贻误下单,于是各种抢票插件应运而生,帮助用户自动登录、自动选择乘车日期和起止站点、自动下单抢票。抢票插件的核心功能之一,便是自动识别登录过程中的验证码图片,原本这个验证码图片是用来阻止程序自动登录的,然而道高一尺魔高一丈,任你采取图片验证码又如何,抢票插件照样能够识别出图片所呈现出来的形状。注意,这里提到的识别图片中的验证码,即为人工智能的一项初级应用。
验证码图片识别,最简单的是数字验证码,因为数字只有从0到9一共十个字符,并且每个数字的形状也比较简单,所以本文就从数字验证码的识别着手,拨开高大上的迷雾,谈谈人工智能的初级应用。
先来看看一张再普通不过的验证码图片:
这张验证码图片蕴含的数字串为8342,拿到该图片,接下来要进行以下步骤的处理:
首先对该图片进行裁剪操作,去掉外围的空白区域,把每个数字所处的区域单独抠出来。如下图所示,四个数字被红框圈出了四段图片:
然后对每个数字方块再做切割,一般是按照九宫格切为九块,分别是左上角、正上方、右上角、正左边、中央、正右边、左下角、正下方、右下角,切割后的效果如下图所示:
之所以把数字方块切成九块,是因为每个数字的形状在不同方位各有侧重点,比如数字3在正左边是空白的,而数字8的正左边有线条;又比如数字6在右上角空白、在右下角有线条,而数字9在右上角有线条、在右下角空白。分别判断九个方位上的线条像素,即可筛选符合条件的数字,进而推断出最可能的数字字符。
一般情况下,图片中的数字颜色较深,其它区域颜色较浅,通过判断每个方格上的像素点颜色深浅,就能得知该方格是否有线条经过。获取像素点的颜色深浅主要有以下几个步骤:
1、调用Bitmap对象的getPixel,获得指定xy坐标的像素点,代码如下:
Color color = bitmap.getPixel(x, y);2、调用Integer类的toHexString方法,把Color对象转换为String对象,代码如下:
String colorStr = Integer.toHexString(color);3、第2步得到的String对象是个长度为8的字符串,其中前两位表示透明度,3到4位表示红色浓度,5到6位表示绿色浓度,7到8位表示蓝色浓度,另外需要把16进制的颜色浓度转换为10进制的浓度数值,示例代码如下:
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开发笔记的完整目录
__________________________________________________________________________
本文现已同步发布到微信公众号“老欧说安卓”,打开微信扫一扫下面的二维码,或者直接搜索公众号“老欧说安卓”添加关注,更快更方便地阅读技术干货。
作者:aqi00 发表于2017/9/21 9:16:20 原文链接
阅读:130 评论:0 查看评论