- 基于像素比对的方式识别图片数字,常见于价格展示中
- 原生库+逻辑(用一张数字图片作为基准,和待预测图片取差)比对,比较轻量级
- 包含预测准确率评价
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)))
预测样图