作者:美晶婚纱-璐璐_723 | 来源:互联网 | 2023-09-14 08:12
表格的扭曲矫正在通过ocr对表格中的图像进行识别的时候发现,表格图像的定位是很重要的.虽然通过hough找直线,设低阈值,可以较高鲁棒性的找出表格的横线,但是表格如果存在一定程度的
研究表明,在用ocr识别表格图像时,表格图像的位置校正很重要。 通过在hough中查找直线并将阈值设定得较低,可以更鲁棒地发现表的横线,但如果表存在一定程度的失真,检测切取的效果就差。 从几篇论文来看,基于函数或摄像机视角的校正确实是有效的,但在目前基于表的应用中,越简单越好
以上是矫正的效果图.想法很简单,
用交叉模板匹配表的交点,过滤在hough中找到的直线的相对位置上不一致的交点。 按列按行排列与交点的排列顺序,通过交点的平均,找到标准网格,交点的配置位置遍历网格,以网格为单位进行从原图像到标准图像的映射变换
代码
class Choose: #十字获取,表格交点坐标点defdetectcross(self,imgt,hsize,wsize,thr=0.65 )十字中心midh,midw=hsize //2,wsize wsize] ) template [ midh-13360 mid H2, ]=255 template ) 3360,midw-1: mid w2 ]=255 match _ RES=cv2.match teted CV2.TM_ccorr_normed(#根据阈值,顶点index=NP.where(match_RESthr ) points=[] for y,xinzip ) index(0), index ) )的返回点#表格子点坐标点defgetnetpoints(self,img ) : ah, 获取aw=img.shape ) : ah ) img=NP.array ) img ) cv2.color _ RGB2gray (kernel=cv2.getstructuringelement 10 ) ) imgt=cv2.erode ) ) imgg iteratiOns=1(imgt=cv2.dilate ) imgt,kernel,iteratiOns=1) ret,_=cv2.tilate cv2.threshold imgt=cv2.threshold (imgt,ret * 1.2,255, cv2.THRESH_BINARY_INV ) #showimage(imgt ) )根据阈值大小和十字图像模板的纵横,查找和查找对应点5 ) : # points=self.deted xinpoints3360#cv2.cirray 1) showimage(imgx,str ) size ) points=self.detectcross ) imgt,40,45, 0.65 )获取表单点#self.drawpoints ) img的points ) mask=NP.zeros (imgt.shape [ :2 ] ) for y,x in points 3360 mask needw=self.finddetaiii表格准则warr=sorted(list(set(NP.Array ) Needw.Flatten () ) ) for w in warr: sw SW:ew )1#保留适当的点纵向排列的点needs_points=[] for y,x in points: if mask[
y, x] >= 2: needs_points.append([y, x]) # self.drawPoints(img, needs_points) # for h1, h2 in needh: # for w1, w2 in needw: # cv2.rectangle(img, (w1, h1), (w2, h2), (0, 0, 255), 2) # showImage(img) # 按照先列后行的顺序,进行网格排序 needs_points = np.array(needs_points) col_scale = [] mg = 8 col_scale.append([needw[0][0] - mg, needw[0][0] + mg]) for i in range(1, len(needw)): front, cur = needw[i - 1], needw[i] col_scale.append([front[1] - mg, cur[0] + mg]) gridx = [] tmppoints = np.array(needs_points)[:, 0].flatten() minv, maxv = tmppoints.min(), tmppoints.max() scale = (maxv - minv) // len(needh) # print(scale, minv, maxv, len(needh)) # idx = 0 for s, e in col_scale: # 过滤不在范围内的,按照列行,排列,与标准线最近的点 where = np.where((needs_points[:, 1] > s) & (needs_points[:, 1]