🧡💛💚💙💜OpenCV实战系列总目录
有任何问题欢迎在下面留言
本篇文章的代码运行界面均在Pycharm中进行
本篇文章配套的代码资源已经上传
上篇内容:
openCV实战-系列教程11:文档扫描OCR识别上(图像轮廓/模版匹配)项目实战、源码解读
5、透视变换调整图像
现在需要做的是将原来的图像转换成一个类似于pdf文档的那种可以正常看出来文字的那种形式的图像,但是图像并不是一个规矩的矩形,需要用坐标变换。也就是说使用透视变换,将不规整的图像转换成规整的矩形。
5.1 透视变换函数
def four_point_transform(image, pts):rect = order_points(pts)(tl, tr, br, bl) = rectwidthA = 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
- 需要传进去两个参数,image:原始输入图像,pts:原始轮廓的四个点坐标
- 这里有一个函数就是4中的内容,原始轮廓的四个点的坐标,通过函数order_points的进行排序,得到方便我们进行计算近似矩形的四个顶点的顺序
- 取出这四个点的坐标,分别记为(tl, tr, br, bl),即(topLeft, TopRight, BottomRight, BottomLeft)
- 分别计算出“第3个点和第4个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为widthA
- 分别计算出“第1个点和第2个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为widthB
- 取出widthA和widthB中之间的较大值保存为maxWidth
- 分别计算出“第1个点和第4个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为heightA
- 分别计算出“第2个点和第3个点的横坐标的差值的平方、以及纵坐标的差值的平方”的和的绝对值保存为heightB
- 取出heightA 和heightB中之间的较大值保存为maxHeight
- 构造矩形的四个顶点,保存为dst 的2*4的二维list
- 第一个坐标为(0,0)
- 根据maxHeight 和maxWidth以及第一个坐标计算出其他三个坐标,因此13、14行略
- 用输入的四个点rect和输出的四个点dst,使用getPerspectiveTransform函数计算变换矩阵,这个过程是一个投影的变换,最后的计算结果是一个映射矩阵,保存为M
- 用原始图像image、映射矩阵M、我们想要的矩形长宽,使用warpPerspective函数进行透视变换
- 返回透视变换结果warped
5.2 图像透视变换
原始图像里面有一张不规整的小票,我们有一个函数把这个小票转换为规整的图像,这个函数在5.1部分已经讲解
warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)
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)
- four_point_transform是已经解析过的函数,orig是原始图像,screenCnt是小票轮廓,ratio是在前面提到过的,图像经过resize的前后比例,最后返回透视变换的图像保存为warped
- 灰度处理
- 使用阈值函数进行二值处理
- 保存ref扫描结果,文件命名为’scan.jpg’
- 打印文字
- 打印图像
- 打印图像
- 等待按按任意键
STEP 3: 变换
在命令行输入以下指令:
tessetact -v
出现以下提示则按照成功:
tesseract 4.00.00alpha
leptonica-1.74.1
libgif 4.1.6(?) : libjpeg 8d (libjpeg-turbo 1.5.0) : libpng 1.6.20 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.3 : libopenjp2 2.1.0
上篇内容:
openCV实战-系列教程11:文档扫描OCR识别上(图像轮廓/模版匹配)项目实战、源码解读