python 标准图片数字OCR识别

  • 基于像素比对的方式识别图片数字,常见于价格展示中
  • 原生库+逻辑(用一张数字图片作为基准,和待预测图片取差)比对,比较轻量级
  • 包含预测准确率评价
import numpy as np
from PIL import Image
import glob


# 取灰度图像、将二位像素压扁为一维、文件名数字切割和对应像素对应
def img_split(img_url):
    img = np.array(Image.open(img_url).convert('L'))
    num = list(img_url.split('/')[-1].split('.')[0])
    arr = np.array(np.split(img.sum(axis=0), 10))
    return img, num, arr


def arr_to_img(img_arr):
    im = Image.fromarray(img_arr)
    im.show()


# 对比函数,将标记好的像素与预测像素对比相似度
def compare(img, num, arr, compare):
    c_img, c_num, c_arr = img_split(compare)
    ok = 0
    for i, img0 in enumerate(arr):
        img0 = img0[img0 > 0]
        sub_list = []
        for j, img1 in enumerate(c_arr):
            img1 = img1[img1 > 0]
            img0_len = len(img0)
            img1_len = len(img1)
            max_len = max(img0_len, img1_len)
            add_arr = np.zeros(abs(img0_len - img1_len))
            if int(num[i]) == 8:
                max_len = 18
            if img0_len > img1_len:
                sub = img0[:max_len] - np.append(img1, add_arr)[:max_len]
            else:
                sub = img1[:max_len] - np.append(img0, add_arr)[:max_len]
            # print(len(sub[sub == 0]))
            # sub = sub.sum()
            sub = len(sub[np.abs(sub) == 0])
            sub_list.append(sub)

        # sub_list = list(sub.sum(axis=(1, 2)))
        min_index = sub_list.index(max(sub_list))
        num0 = num[i]
        num1 = c_num[min_index]
        if num0 != num1:
            print(i, (i, num0), (min_index, num1))
            print(num)
            print(c_num)
            print('sub_list', sub_list)
        else:
            ok += 1
            # im1_arr = img_compare_array[min_index][row0:row1, col0:col1]
    return ok


if __name__ == '__main__':
	# 包含两部分,第一部分是基准图片,第二部分是预测图片
    images = glob.glob('/Users/xxx/qinggua_tools/data/num/data/*.png') +\
             glob.glob('/Users/xxx/qinggua_tools/data/num/data/*.png')
    img, num, arr = img_split(images[0].replace('\\', '/'))
    ok_list = np.array([])
    for i, v in enumerate(images[1:]):
        ok = compare(img, num, arr, v.replace('\\', '/'))
        ok_list = np.append(ok_list, ok)
    print('ok_list', ok_list)
    #评价准确率,1.0那是都准确
    print('accuracy:{}'.format(len(ok_list[ok_list == 10]) / len(ok_list)))

预测样图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值