常见的三个视觉识别应用:计算机视觉项目 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(
接下来就是一个最主要的一个部分,就是透视变换,也就是说我们想把后面的背景全部去掉,也就是想把我们轮廓检测出来的这一块拿出来单独成一个图像,然后方便我们去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
这里我们就把整个轮廓给抠出来了,接下来就是识别的操作。
首先我们先要对OCR文件进行下载:下载地址
用到的是最后一个。或者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'),进行输出识别内容。最后一个参数指定语言的。然后显示出来把图像。