快捷搜索:  汽车  科技

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别from PIL import Image import pytesseract import cv2 import os 1234image = cv2.imread('scan.jpg') gray = cv2.cvtColor(image cv2.COLOR_BGR2GRAY) if preprocess == "thresh": gray = cv2.threshold(gray 0 255 cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] if preprocess == "blur": gray = cv2.medianBlur(gray 3) filename = "{}.jpg".format(os.getpid()) cv2.imwrite(

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别(1)

接下来就是一个最主要的一个部分,就是透视变换,也就是说我们想把后面的背景全部去掉,也就是想把我们轮廓检测出来的这一块拿出来单独成一个图像,然后方便我们去OCR文字识别。

warped = four_point_transform(orig screenCnt.reshape(4 2) * ratio) 1

我们直接跳进four_point_transform函数中。

def four_point_transform(image pts): rect = order_points(pts) (tl tr br bl) = rect # 计算输入的w和h值 widthA = np.sqrt(((br[0] - bl[0]) ** 2) ((br[1] - bl[1]) ** 2)) widthB = np.sqrt(((tr[0] - tl[0]) ** 2) ((tr[1] - tl[1]) ** 2)) maxWidth = max(int(widthA) int(widthB)) heightA = np.sqrt(((tr[0] - br[0]) ** 2) ((tr[1] - br[1]) ** 2)) heightB = np.sqrt(((tl[0] - bl[0]) ** 2) ((tl[1] - bl[1]) ** 2)) maxHeight = max(int(heightA) int(heightB)) # 变换后对应坐标位置 dst = np.array([ [0 0] [maxWidth - 1 0] [maxWidth - 1 maxHeight - 1] [0 maxHeight - 1]] dtype = "float32") # 计算变换矩阵 M = cv2.getPerspectiveTransform(rect dst) warped = cv2.warpPerspective(image M (maxWidth maxHeight)) # 返回变换后结果 return warped 1234567891011121314151617181920212223242526

首先利用order_points获取坐标。我们可以看到首先设定了rect这个0矩阵,用来传我们的坐标点,按顺序找到对应坐标0123分别是 左上,右上,右下,左下

def order_points(pts): # 一共4个坐标点 rect = np.zeros((4 2) dtype = "float32") s = pts.sum(axis = 1) rect[0] = pts[np.argmin(s)] rect[2] = pts[np.argmax(s)] # 计算右上和左下 diff = np.diff(pts axis = 1) rect[1] = pts[np.argmin(diff)] rect[3] = pts[np.argmax(diff)] return rect 1234567891011121314

这里pts.sum(axis = 1)就是把横纵坐标进行一个相加的操作,那么最小的肯定就是左上的点,最大的肯定就是右下。
np.diff(pts axis = 1)是求diff=y-x 那么最小的是右上,最大的是左下。这样我们就把轮廓的四个点拿出来了。返回去我们继续看,(tl tr br bl) = rect这里拿到了这四个点。widthA和widthB分别计算矩形上下的边长分别是多少,我们需要选择一个相对更大的,来把整个文件图片框住。heightA和heightB就是对于竖直的两个边进行了判断。然后定义一个转换后的坐标值。然后需要计算一个如何将当前图像转换到定义好的图像,需要计算一个转换矩阵M,然后我们通过使用原始矩阵*M就可以得到处理后的结果了。

然后对于经过透视变换的图进行形态学处理。并且展示结果。

warped = cv2.cvtColor(warped cv2.COLOR_BGR2GRAY) ref = cv2.threshold(warped 100 255 cv2.THRESH_BINARY)[1] cv2.imwrite('scan.jpg' ref) print("STEP 3: 变换") cv2.imshow("Original" resize(orig height = 650)) cv2.imshow("Scanned" resize(ref height = 650)) cv2.waitKey(0) 1234567

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别(2)


这里我们就把整个轮廓给抠出来了,接下来就是识别的操作。

项目OCR识别操作介绍

首先我们先要对OCR文件进行下载:下载地址

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别(3)


用到的是最后一个。或者pip install pytesseract。
导入第三方库

from PIL import Image import pytesseract import cv2 import os 1234

image = cv2.imread('scan.jpg') gray = cv2.cvtColor(image cv2.COLOR_BGR2GRAY) if preprocess == "thresh": gray = cv2.threshold(gray 0 255 cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1] if preprocess == "blur": gray = cv2.medianBlur(gray 3) filename = "{}.jpg".format(os.getpid()) cv2.imwrite(filename gray) text = pytesseract.image_to_string(Image.open(filename) lang='chi_sim') print(text) cv2.imshow("Image" image) cv2.imshow("Output" gray) cv2.waitKey(0) 1234567891011121314151617

这里就是一些形态学处理,其中包括转灰度,然后进行中值滤波或者二值。最后通过pytesseract.image_to_string(Image.open(filename) lang='chi_sim'),进行输出识别内容。最后一个参数指定语言的。然后显示出来把图像。

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别(4)

常见的三个视觉识别应用:计算机视觉项目 2 文档扫描OCR识别(5)

猜您喜欢: