zoukankan      html  css  js  c++  java
  • 非黑即白--谷歌OCR光学字符识别

    # coding=utf-8
    #非黑即白--谷歌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自动做了)
    
    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://1111.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(' ', '')
  • 相关阅读:
    【深度学习Deep Learning】资料大全
    在谷歌中缓存下载视频离线观看,js代码
    asp.net mvc 中Html.ValidationSummary显示html
    asp.net网站访问时不能显示页面
    k8s install kubeadm网络原因访问不了谷哥and gpg: no valid OpenPGP data found. 解决办法
    火绒杀毒软件更安静
    Linux使用mount挂载Windows共享文件夹
    spark学习
    https://blog.csdn.net/tangdong3415/article/details/53432166
    正则表达式
  • 原文地址:https://www.cnblogs.com/themost/p/7436071.html
Copyright © 2011-2022 走看看