最近在学图像识别,浅做一下笔记 图像识别 # 需要的模块 # import os # #光学识别生成器 # from cnocr import CnOcr # #读取图片(主要用到 ,裁剪图片的功能) # from PIL import Image # # 流程 # 通过os模块读取文件位置 # 获取每张图片的名字 实例化图片对象 # 通过Image库 对文件对象进行位置裁剪 获取需要被识别的位置的坐标(左上右下) # 对裁剪下来的文件进行单独保存 # 通过ocr模块对文本进行识别 # 返回数据
# 文件操作模块 import os # 光学识别生成器w from cnocr import CnOcr # 读取照片(主要用到其,裁剪照片功能) from PIL import Image # 写入excel模块 import openpyxl # 识别中文或者数字的对象 ocr = CnOcr() image_src = r"./images" # 这是要提取的数据的位置定位参数 顺序(左(x),上(y),右(x),下(y)) place=[[186,205,347,237],[1298,85,1455,112],[977,964,1050,994],[510,762,641,789]] def shibie(): image_list = [] datalist=[] # os.walk()目录遍历器 # 遍历这个文件夹的所有照片文件名字 root:当前文件夹的名字, dirs当前文件夹下的所有目录,列表形式 file当前文件的下的所有文件 列表形式 for root, dirs, file in os.walk(image_src): # 由于在for循环内所以需要把他抛出for循环 image_list = file print(root) print(dirs) print(file) for i in image_list: data = [] image_url = "images/" + i # 机器读取图片需要读取字节码 # 将img.open()括号中的内容更改为你的图片地址 new_img = Image.open(image_url) for v in place: # print(new_img) left = v[0] up = v[1] right = v[2] down = v[3] # 通过上面给出的坐标去裁剪照片 这里的方法最多传入一个参数 那这个参数就是包含所有坐标的元祖参数 imag_x = new_img.crop((left, up, right, down)) # 将照片进行保存 imag_x.save("imag1.png") # 通过实例化的图片识别对象去识别裁剪下来的照片上的内容 image_text = ocr.ocr("imag1.png") print(image_text) #打印出来是一个一个切割好的字符串在列表的列表里面 # 把数据先放在一个列表里 data.append("".join(image_text[0][0])) # 再把每张发票数据列表放入一个新列表 datalist.append(data) print(datalist) savedata(datalist) def savedata(datalist): # 通过openpyxl的workbook方法实例化了一个xls对象(就是excel文件) xls = openpyxl.Workbook() #通过文件对象创建一个sheet worksheet=xls.active # 直接添加可迭代对象(列表之类的) worksheet.append(["机器编号","发票代码","开票人","价税合计(大写)"]) for data in datalist: worksheet.append(data) #跳出循环命个名字 xls.save("图像识别11.xls") if __name__ == '__main__': shibie() print("执行完毕!") """其实也蛮简单的 实例化识别图片信息的对象 实例化裁剪图片的对象 先遍历一下文件路径 放在列表里面 然后写一下横坐标纵坐标的列表 将路径放到实例化的图片裁剪方法里面image.open(图片路径) 调用实例化的裁剪图片的对象的crop方法裁剪指定坐标图片 然后给出一个image_x对象 再通过这个image_x对象保存这张裁剪后的图片 image_x.save("filename") 再通过实例化的识别图片信息对象识别截图 返回一个所有全是字符串的列表 data_text 来个字符串拼接 "".join(全是字符串的列表) 最后每张发票的所有数据放在一个列表 再把所有含有每张发票信息的列表放在一个大列表里面 最后传递给保存数据参数 openpyxl 这个写excel模块是真的好用 直接往sheet里面写可迭代对象就行 安逸的很不用想lxml要算坐标 下载用 pip install pillow 导入 from PIL import Image """ # import os # # 识别类 # from cnocr import CnOcr # # 读取图片的类 # from PIL import Image # # # 实例化图片对象 # new_img=Image.open("./发票.png") # # 坐标 # place=[186,205,347,237] # # 通过坐标进行裁剪 # images=new_img.crop(place) # # 裁剪成图像 # images.save("image1.png") # # 生成识别对象 # ocr=CnOcr() # # 通过ocr对象去识别 # image_text=ocr.ocr("image1.png")[0] # # # data="".join(image_text) # print(data)