Python + OpenCV:OCR图像分割

don*_*nte 18 python opencv image-processing computer-vision

我试图从这个收据的玩具例子做OCR.使用Python 2.7和OpenCV 3.1.

在此输入图像描述

灰度+模糊+外部边缘检测+收据中每个区域的分段(例如"类别",以便稍后查看哪一个标记为 - 在这种情况下是现金 - ).

当图像"倾斜"以便能够正确转换然后"自动"分割收据的每个部分时,我觉得很复杂.

例:

在此输入图像描述

有什么建议吗?

下面的代码是一个示例,直到边缘检测,但收据就像第一个图像.我的问题不是图像文字.是图像的预处理.

任何帮助超过赞赏!:)

import os;
os.chdir() # Put your own directory

import cv2 
import numpy as np

image = cv2.imread("Rent-Receipt.jpg", cv2.IMREAD_GRAYSCALE)

blurred = cv2.GaussianBlur(image, (5, 5), 0)

#blurred  = cv2.bilateralFilter(gray,9,75,75)

# apply Canny Edge Detection
edged = cv2.Canny(blurred, 0, 20)

#Find external contour

(_,contours, _) = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Run Code Online (Sandbox Code Playgroud)

R. *_*hna 18

关于你描述的第一步的一个很棒的教程可以在pyimagesearch上找到(他们一般都有很棒的教程)

简而言之,正如Ella所描述的那样,你必须使用它cv2.CHAIN_APPROX_SIMPLE.一个稍微更健壮的方法是使用cv2.RETR_LIST而不是cv2.RETR_EXTERNAL然后对区域进行排序,因为它应该在白色背景中正常工作/如果页面在背景中刻有更大的形状等.

转到问题的第二部分,分割字符的好方法是使用OpenCV中提供的Maximally stable extremal region extractor.在CPP一个完整的实现可以在这里的一个项目,我在最近帮忙.Python实现将遵循(代码如下适用于OpenCV 3.0+.对于OpenCV 2.x语法,请在线检查)

import cv2

img = cv2.imread('test.jpg')
mser = cv2.MSER_create()

#Resize the image so that MSER can work better
img = cv2.resize(img, (img.shape[1]*2, img.shape[0]*2))

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
vis = img.copy()

regions = mser.detectRegions(gray)
hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions[0]]
cv2.polylines(vis, hulls, 1, (0,255,0)) 

cv2.namedWindow('img', 0)
cv2.imshow('img', vis)
while(cv2.waitKey()!=ord('q')):
    continue
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

这给出了输出

在此输入图像描述

现在,为了消除误报,您可以简单地循环通过船体中的点,并计算周长(船体中所有相邻点之间的距离之和[i],其中船体[i]是一个凸包中所有点的列表).如果周长太大,则将其归类为不是字符.

由于图像的边框是黑色的,因此图像上的诊断线即将到来.只要读取图像就可以通过添加以下行来删除(第7行下方)

img = img[5:-5,5:-5,:]
Run Code Online (Sandbox Code Playgroud)

它给出了输出

在此输入图像描述

  • 谢谢@RS Nikhil Krishna!如果我将您的代码用于收据的图像(不偏斜)(请参阅上面的问题)。我没有很好的细分。题。我应该调整哪些参数?凸包?提前致谢! (2认同)

Eli*_*lia 7

我头顶的选项需要提取倾斜图像的4个角.这是通过使用cv2.CHAIN_APPROX_SIMPLE而不是cv2.CHAIN_APPROX_NONE在找到轮廓时完成的.之后,您可以使用cv2.approxPolyDP并希望保留收据的4个角(如果您的所有图像都像这样,那么没有理由说它不起作用).

现在使用cv2.findHomographycv2.wardPerspective根据源点来校正图像,源点是从倾斜图像中提取的4个点和应该形成矩形的目标点,例如完整图像尺寸.

在这里您可以找到代码示例和更多信息: OpenCV-图像的几何变换

此答案可能也很有用 - SO - 检测并修复文本偏斜

编辑:纠正第二个链约cv2.CHAIN_APPROX_NONE.