Opencv进阶篇---文档扫描OCR识别

原图:
Opencv进阶篇---文档扫描OCR识别_第1张图片
STEP1:边缘检测
Opencv进阶篇---文档扫描OCR识别_第2张图片
STEP2:获取轮廓
Opencv进阶篇---文档扫描OCR识别_第3张图片
STEP3:透视变换:平移、旋转、翻转变换,使图像摆正
Opencv进阶篇---文档扫描OCR识别_第4张图片
STEP4:OCR实现字符识别 (下载包的地址:https://digi.bib.uni-mannheim.de/tesseract/)下载安装包并配置环境变量
修改‘/’,否则会出现变量找不到的情况,在windows中‘/’意义丰富,可能造成无法识别的情况,在该路径下找到:E:\PythonPackage\python\Lib\site-packages**pytesseract\pytesseract.py**文件中------>tesseract_cmd = 'tesseract’改为tesseract的绝对路径“E:\PythonPackage\OCR\Tesseract-OCR/tesseract.exe”

结果为另一张图片的内容,该图像内容排版更为整齐,方便现实,内容如下:
Opencv进阶篇---文档扫描OCR识别_第5张图片
完整代码:

import cv2 as cv
from imutils.perspective import four_point_transform
import pytesseract
import os
from PIL import Image
import argparse
import matplotlib as plt
import numpy as np
image=cv.imread("E:\OpenCVTests\page.jpg")
ratio=image.shape[0]/500#比例,宽除以500,w自行计算
orig=image.copy()#copy()不对原图改变
image=cv.resize(orig,None,fx=0.2,fy=0.2)
#预处理操作
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
gray=cv.GaussianBlur(gray,(5,5),0)
edged=cv.Canny(gray,75,200)
#轮廓检测
cnts,hierancy=cv.findContours(edged.copy(),cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)#找出图像中的轮廓
cnts=sorted(cnts,key=cv.contourArea,reverse=True)[:5]#将轮廓按照面积的大小进行排序,并且选出前5个中最大的轮廓,当多个小票时
for c in cnts:
    peri=cv.arcLength(c,True)#周长,闭合
    approx=cv.approxPolyDP(c,0.02*peri,True)#检测出来的轮廓可能是离散的点,故因在此做近似计算,使其形成一个矩形
                        #做精度控制,原始轮廓到近似轮廓的最大的距离,较小时可能为多边形;较大时可能为矩形
                                 #True表示闭合
    if len(approx)==4:#如果检测出来的是矩形,则break本段if
        screenCnt=approx
        break
cv.drawContours(image,[screenCnt],-1,(0,0,255),2)#绘制轮廓,-1表示全部绘制

#变换
wraped=four_point_transform(orig,screenCnt.reshape(4,2)*ratio)#透视变换:摆正图像内容
wraped=cv.cvtColor(wraped,cv.COLOR_BGR2GRAY)
ref=cv.threshold(wraped,100,255,cv.THRESH_BINARY)[1]
#ref=cv.resize(ref,None,fx=0.3,fy=0.3)
cv.imwrite("E:\OpenCVTests\OCR\_test02.jpg",ref)#必须加后缀名

image=cv.imread("E:\OpenCVTests\OCR\_test02.jpg")
gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
preprocess='blue'#thresh  #做预处理选项
if preprocess=='blur':
    gray=cv.blur(gray,(3,3))
if preprocess=='thresh':
    gray=cv.threshold(gray,0,255,cv.THRESH_BINARY)
    
filename="{}.png".format(os.getpid())
cv.imwrite(filename,gray)
text=pytesseract.image_to_string(Image.open(filename))#转化成文本
print(text)
os.remove(filename)

cv.waitKey(0)
cv.destroyAllWindows()

你可能感兴趣的:(OpenCV)