前言
随着核酸常态化的进行,核酸检测已经越来越成为每个人工作生活中的一部分。在很多单位里,出于统计需求,往往需要收集个人核酸截图。收集截图后一般要求对图片文件名按照某种特定格式进行重命名(如工号+姓名),以便查看。然而这往往是一个重复且枯燥的工作,包括了以下几步:将核酸截图(从微信)保存到文件夹--查看截图获取姓名等信息--为该图片重新命名。如果图片的数量不太多,手动为每张图片重新命名固然可行。但倘若图片的数量较多,为每张图片一个个命名将会耗费大量的时间。幸运的是,我们可以利用Python帮助实现从图片信息识别到文件重命名这一自动化过程。
目录
一、OpenCV 介绍
在介绍代码之前,有必要对代码中的几个核心库的使用方法进行简单的描述。首先是OpenCV。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。该库拥有超过 2500 种优化算法,其中包括一整套经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别对象、对视频中的人类行为进行分类、跟踪摄像机运动、跟踪移动对象等等,可以说是涵盖了机器视觉的大部分应用场景。在本文中,该库用来读取核酸截图并且对图片进行裁剪、缩放以及二值化处理。
##安装OpenCV库
pip install opencv-python
二、EasyOCR 介绍
EasyOCR 是一个允许将图像转换为文本的python包。这是迄今为止实现 OCR 最简单的方法,可以访问 70 多种语言,包括英语、中文、日语、韩语、印地语,还有更多正在添加中。EasyOCR 由 Jaided AI 公司创建。在本文中,该库用来识别核酸截图上的姓名等信息。
##安装EasyOCR库
pip install easyocr
三、代码
由于各地核酸码并不统一,因此图片上的信息读取也会有所差别。下面以广东地区粤康码为列进行演示,读者需要根据自身需求对代码进行调整。
可以看到核酸截图上的姓名第二个字用*替代了,因此在实际命名中,我们需要首先准备一份完整的名字信息表,与截图上的名字进行比较,如果配对,则用该名字对文件进行重命名。
1.引入库
import pandas as pd
import os
import cv2
import easyocr
import re
2.获取截图路径
def GetImage(path): #path为截图所在的文件夹路径
os.chdir(path) #将python工作路径切换到截图所在的文件夹
return os.listdir() #返回文件夹内所有截图的原名称
3.读取图片
def ReadImage(img_path):
img=cv2.imread(img_path,0) #将图片导入cv2中进行处理
ret,thresh=cv2.threshold(img,160,255,cv2.THRESH_BINARY) #对图片进行二值化处理
thresh=thresh[150:600,:] #对图片进行裁剪
thresh=cv2.resize(thresh,None,fx=0.5,fy=0.5) 对图片进行缩放以减小图片大小
return thresh #返回图片
4.识别图片信息
def ImgRecognition(img,reader): #reader为easyocr.Reader引用
result=reader.readtext(img,detail=0) #读取图片上的文字
return result #返回读取结果
5.执行代码
if __name__=="__main__":
data=pd.read_excel("name.xlsx") #读取完整姓名信息
data=data["姓名"].tolist()
reader=easyocr.Reader(['ch_sim']) #初始化easyocr
jpg_list=GetImage(".\Path") #jpt_list为所有图片名称的列表
for img in jpg_list: #遍历所有图片
IMG=ReadImage(img)
result="".join(ImgRecognition(IMG,reader))
for name in data:
name_sub=re.sub(r"(\w)\w",r"\1*",name) #现用*替代name中的第二个字
if re.search(name_sub.replace("*","\*"),result)!=None: #比较name和读取的result
try:
os.rename(img,name+".jpg") #重命名文件
print(img,"-->",name)
break
except:
pass
总结
用python对核酸截图进行重命名的原理简单,但由于easyocr的文字识别率难以达到100%准确,因此会有一些图片命名不成功,对于这些图片,可以通过手动命名。同时为了加快easyocr的识别速度,需要开启GPU。