非黑即白--谷歌OCR光学字符识别
Posted 道高一尺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非黑即白--谷歌OCR光学字符识别相关的知识,希望对你有一定的参考价值。
#非黑即白--谷歌OCR光学字符识别 颜色的世界里,非黑即白。computer表示深信不疑。 今天研究一下前沿技术OCR光学识别庞大领域中的众多分支里的一个开源项目的一个包-tesseract。 能让机器识别图片是无数工程师梦寐以求的事 任何物体只有成功转为二进制才有可能被机器识别,而识别是做出一系列智能行为的前提 下面以一张验证码为例梳理一下机器识别的思路: 准备工作: 1、取到图片地址,在线转化为图片流或者下载到本地 2、PIL, pytesseract 两个包,其实主要用他们中各一个函数,前者是用Image将图片做像素级处理,以便后者用image_to_string将图片转化为字符串 3、图像基础知识:RGB所代表的红绿蓝色域均为0-255,三色叠加0代表黑色,255代表白色,区间值即为灰度 流程: 1、读取图片转为Image函数的对象 2、转化为灰度图(即黑白图片),进行二值化(强化黑白) 3、坐标系去除噪点,继续强化黑白 4、转化为字符串(涉及到分割、识别,image_to_string自动做了) # coding=utf-8 from PIL import Image from pytesseract import image_to_string # 接收图片地址,和int类型的灰度值作为阀值,返回黑白图 def parse(img_address, g): img = Image.open(img_address) # 转化为灰度图 imgL = img.convert(‘L‘) # imgL.show() img_load = imgL.load() print(imgL.size) # 遍历宽与高中的每一个像素并依据阈值判断,进行二值化 for y in range(imgL.size[1]): for x in range(imgL.size[0]): # 阈值就是寻找灰度的平衡点 # 小于阈值的数就是向黑色靠拢,直接赋值为黑,大于阈值即向255靠拢,直接赋值为白 if img_load[x, y] <= g: img_load[x, y] = 0 else: img_load[x, y] = 255 return imgL # 擦除噪点,对L模式下的图处理 # x,y 像素点坐标 # g 阈值(0-255之间的灰度值) # n 强度(周围有几个符合阈值的像素点才留下) def wipe_spot(img, x, y, g, n): count = 0 if img[x - 1, y + 1] == g: count += 1 if img[x, y + 1] == g: count += 1 if img[x + 1, y + 1] == g: count += 1 if img[x - 1, y] == g: count += 1 if img[x + 1, y] == g: count += 1 if img[x + 1, y - 1] == g: count += 1 if img[x, y - 1] == g: count += 1 if img[x + 1, y - 1] == g: count += 1 if count < n: img[x, y] = 255 # 示例 imgl = parse("D://77.jpg", 150) imgload = imgl.load() for y in xrange(imgl.size[1]): for x in xrange(imgl.size[0]): if imgload[x, y] == 0: wipe_spot(imgload, x, y, 0, 1) imgl.show() print image_to_string(imgl).replace(‘ ‘, ‘‘)
以上是关于非黑即白--谷歌OCR光学字符识别的主要内容,如果未能解决你的问题,请参考以下文章