之前写过一篇关于《利用pytesseract库进行图片文字识别》的文章,那篇文章中,仅仅是做一个简单的demo,用于演示图片文字识别的功能。但是那时候挖了一个坑。在面对验证码的时候,图片的噪点对识别准确性影响很大。今天,针对这个问题,对要识别的图片做一个简单的处理。
之前的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# -*-encoding:utf-8-*- import pytesseract from PIL import Image def main(): image = Image.open("1.jpg") #image.show() #打开图片1.jpg text = pytesseract.image_to_string(image,lang='chi_sim') #使用简体中文解析图片 #print(text) with open("output.txt", "w") as f: #将识别出来的文字存到本地 print(text) f.write(str(text)) if __name__ == '__main__': main() |
我们今天要识别的是一些简单的验证码图片。图片是爬取某网站的图片验证码来的。
我们需要将图片转化为灰度图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
def get_bin_table(threshold = 230): # 获取灰度转二值的映射table table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) return table image = Image.open(img_path) imgry = image.convert('L') # 转化为灰度图 table = get_bin_table() out = imgry.point(table, '1') |
再通过pytesseract来识别黑白色的数字:
1 2 3 4 5 6 7 |
text = pytesseract.image_to_string(out, config='digits') # 去除数字以外的其他字符 fil = filter(str.isdigit, text) new_text = '' for i in fil: new_text += i print(new_text) |
最后将识别出来的数字复制到子目录out中并重命名为识别出来的文字:
1 |
os.rename(parent + '\\out\\%s' % filename, parent + '\\out\\%s.bmp' % new_text) |
最后显示的结果如下:
嘛,虽然看上去好像很美好,但是,目前还是存在很多问题。比如说识别的正确率。因为噪点的干扰,有时候四位的数字会识别出五位甚至六位。目前暂时没有很好的办法。留着坑以后继续填吧。