图像预处理部分
处理原始图像,原始图像可能非常的不规整,且图片亮度上比较灰暗,所以要想进行准确的ocr识别,需要事先处理下原始图像。主要包括下面几个操作:
- 首先通过边缘检测,识别出需要识别的框体部分,即去掉冗余的背景啥的
- 通过轮廓检测,锁定框体外部的矩形框
- 透视变换操作,把矩形框及以内的内容进行规整
下面就是每一步的具体操作
import numpy as np
import cv2
def cv_show(title, img):
cv2.imshow(title, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def resize(image, width=None, height=None, inter=cv2.INTER_AREA):
"""resize函数之所以自定义,是可以只指定高度或者高度
原理就是:
如果只指定某一个维度,图片的高度和宽度都会同比例缩小,比如指定height,那就宽度变成height/float(h)*w, 高度为height, 指定width同理
如果都指定, 那么就按照实际的大小resize
"""
dim = None
(h, w) = image.shape[:2]
if width is None and height is None:
return image
if width is None:
r = height / float(h)
dim = (int(w*r), height)
else:
r = width / float(w)
dim = (width, int(h*r))
resized = cv2.resize(image, dim, interpolation=inter)
return resized
# 读取图片
image = cv2.imread("images/receipt.jpg")
cv_show('img', image) # 原始图片是2448*3264, 太大了,下面需要进行resize操作
# resize操作之前,需要保存resize的比例,以及原始图像
# 下面要按照500的比例对图像进行resize, 那么原始图像的每个像素点的位置都会改变,记住ratio是为了最终能还原到原始的位置上去
ratio = image.shape[0] / 500.0
orig = image.copy()
image = resize(orig, height=500)
cv_show('img', image)
边缘检测
# 预处理 转成灰度图 -> 高斯滤波 -> Canny边缘检测
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#gray = cv2.GaussianBlur(gray, (5, 5), 0) 边缘检测算法其实就是用的高斯滤波,所以这里这个不用发现更加清晰些