Python Opencv 图片识别表格:边框线检测

Python Opencv 图片识别表格:边框线检测

图片识别表格的一个重要步骤是检测出图片中表格的边框线。
在这里插入图片描述
边框线检测最大的挑战是笔画中出现的横线和竖线。你可能认为可以通过线条的长短来区分,但如果是一张密集的表格,某个边框线只出现在一个单元格里,它也会很短。因此这种思路也会有兼容性问题。

网上有很多关于线段检测的算法,但是都只是在某种特定情况下是可行的,当我们要识别各种图片中的各种表格时,不得不考虑一种更健壮更全面的算法。

整体思路如下:

  • 通过image_binary变为二值图像 确保图像为白底黑字,因为稍后的操作都是膨胀白色
  • 通过dilate膨胀白色横块抹去文字和竖线。因为文字的笔画之间是有白色间隙的,通过白色横块膨胀,文字会被大部分抹去,除了极少的横线笔画。膨胀结果取反变成黑底白线得到A
  • 通过dilate膨胀白色竖块抹去文字和横线。因为文字的笔画之间是有白色间隙的,通过白色竖块膨胀,文字会被大部分抹去,除了极少的竖线笔画。膨胀结果取反变成黑底白线得到B
  • AB结果通过bitwise_or合并得到边框检测结果

采用dilate算法时最重要的是kernel的设计,kernel最重要的是size,网上看到的算法大部分是按照图片宽高进行一个比列的缩放得到size,实际效果并不好。我们这个算法采用了图片宽高的平方根进行一定的调整后形成size,实测效果非常好,很好的解决了图片分辨率和线条之间的关系。
在这里插入图片描述
完整代码如下:

#转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

#转为二值图
ret, binary = cv2.threshold(gray, black_thr, 255, cv2.THRESH_BINARY)

# 膨胀算法的色块大小
h, w = binary.shape
hors_k = int(math.sqrt(w)*1.2)
vert_k = int(math.sqrt(h)*1.2)

# 白底黑字,膨胀白色横向色块,抹去文字和竖线,保留横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (hors_k,1))
hors = ~cv2.dilate(binary, kernel, iterations = 1) # 迭代两次,尽量抹去文本横线,变反为黑底白线

# 白底黑字,膨胀白色竖向色块,抹去文字和横线,保留竖线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,vert_k))
verts = ~cv2.dilate(binary, kernel, iterations = 1) # 迭代两次,尽量抹去文本竖线,变反为黑底白线

# 横线竖线检测结果合并
borders = cv2.bitwise_or(hors,verts)

需要注意的是都是对dilate的结果取反得到黑底白线,便于后面通过bitwise_or叠加得到borders

实际效果如下:

黑白二值:
在这里插入图片描述
横线检测:

在这里插入图片描述

竖线检测:

在这里插入图片描述

边框合并

在这里插入图片描述

可以看到算法结束后,仍然存在一些干扰点,因此还需要进一步的算法进行过滤,将在后续文章中讲解。

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
车牌图片识别是计算机视觉领域的一个重要应用,可以帮助交警部门、停车场管理部门等机构快速准确地识别车牌号码,提高工作效率。Python Opencv 是一种强大的计算机视觉库,能够实现车牌图片识别的关键技术。 下面是一些实现车牌图片识别的关键技术: 1. 图像预处理:对车牌图片进行灰度化、二值化、去噪、边缘检测等处理,以便更好地提取车牌信息。 2. 车牌定位:通过图像处理技术找到车牌的位置,可以采用基于颜色、形状、纹理等特征的方法。 3. 字符分割:将车牌的字符分割出来,可以采用基于像素间距、字符宽高比、字符间距等特征的方法。 4. 字符识别:对分割出来的字符进行识别,可以采用基于模板匹配、特征提取、深度学习等方法。 以下是一个简单的 Python Opencv 车牌图片识别的代码示例: ```python import cv2 # 读取图片并进行灰度化 img = cv2.imread('car_plate.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 进行边缘检测 edges = cv2.Canny(gray, 100, 200) # 进行车牌定位 contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: x, y, w, h = cv2.boundingRect(contour) if w > 100 and h > 30 and w < 400 and h < 150: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该代码通过读取一张车牌图片,进行灰度化和边缘检测,并通过车牌定位方法找到车牌的位置,并用矩形框出车牌。在实际应用,可以根据需要进一步进行字符分割和字符识别等处理,实现车牌图片识别的完整流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值