标签:
function convert_grey(image_data){ for (var x = 0; x < image_data.width; x++){ for (var y = 0; y < image_data.height; y++){ var i = x*4+y*4*image_data.width; var luma = Math.floor(image_data.data[i] * 299/1000 + image_data.data[i+1] * 587/1000 + image_data.data[i+2] * 114/1000); image_data.data[i] = luma; image_data.data[i+1] = luma; image_data.data[i+2] = luma; image_data.data[i+3] = 255; } } }
接下来Canvas被分解成3个独立的像素矩阵,每个矩阵都包含一个字母。(按道理来说,这是非常容易的事情。每个字母都由不同颜色组成,可以直接用颜色区分不同的字母。)
filter(image_data[0], 105); filter(image_data[1], 120); filter(image_data[2], 135); function filter(image_data, colour){ for (var x = 0; x < image_data.width; x++){ for (var y = 0; y < image_data.height; y++){ var i = x*4+y*4*image_data.width; // Turn all the pixels of the certain colour to white if (image_data.data[i] == colour) { image_data.data[i] = 255; image_data.data[i+1] = 255; image_data.data[i+2] = 255; // Everything else to black } else { image_data.data[i] = 0; image_data.data[i+1] = 0; image_data.data[i+2] = 0; } } } }
然后最后,为了得到一个清晰的字母,我们还要把那些不相干的噪声像素从图片上去除。具体的方法,先要找到那些前面或者后面被黑色(之前没有匹配的像素)包裹的白色像素(之前已经匹配的像素),如果找到这样的像素,就简单的把它门直接删除。
var i = x*4+y*4*image_data.width; var above = x*4+(y-1)*4*image_data.width; var below = x*4+(y+1)*4*image_data.width; if (image_data.data[i] == 255 && image_data.data[above] == 0 && image_data.data[below] == 0) { image_data.data[i] = 0; image_data.data[i+1] = 0; image_data.data[i+2] = 0; }
我们现在已经得到了非常接近的图形,但还不够明确。脚本接下来会检测出这些形状的边缘,具体的是要找到图形中最上面、最下面、最左面和最右面的像素,然后把图形转换成矩形,最后将矩形的数据转换为一个20*25的矩阵。
cropped_canvas.getContext("2d").fillRect(0, 0, 20, 25); var edges = find_edges(image_data[i]); cropped_canvas.getContext("2d").drawImage(canvas, edges[0], edges[1], edges[2]-edges[0], edges[3]-edges[1], 0, 0, edges[2]-edges[0], edges[3]-edges[1]); image_data[i] = cropped_canvas.getContext("2d").getImageData(0, 0, cropped_canvas.width, cropped_canvas.height);
补充说明一下,这个脚本应该算是一个特例吧,这项技术可能会应用在更多设计不良的验证码上,但对于更多设计复杂的验证码来说,就有点力不从心了(尤其是这种基于客户端的分析)。
我非常期待能有更多人从这个项目中得到灵感,开发出更多有意思的东西来,它的潜力太巨大了。
《译文》借助OCR和神经网络,用JavaScript识别验证码
标签:
原文地址:http://www.cnblogs.com/longyi/p/4630694.html