表格识别之图像基础+轮廓提取+透视校正

一、图片读取cv2.imread(路径,格式3选1)

格式=1:彩色;0:灰度;-1同1,数据结构如下:

前面是彩色图,三维;后面是灰度图,二维。

 二、图像二值化cv2.threshold,cv2.adaptiveThreshold

1. cv2.threshold(对象,阈值,设定值,阈值规则5选1),可处理彩色图。比如:

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)。

ret:True或False,代表有没有读到图片;dst: 目标图像;

表示大于127值的全置为255,否则置为0。

2. cv2.adaptiveThreshold(加工对象,设定值,计算方法2选1,阈值规则5选1,阈值区域大小,常量),只能处理灰色图。比如:

th3 = cv2.adaptiveThreshold(~img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,35,-5),35*35区域?加权平均加上5设为阈值(常量可以为负),大于阈值置为255,否则置0。文字表格效果不错,见下图:

不加“~”,即在源对象前不加“~”,cv2.adaptiveThreshold(img,255,...,效果如下:

三、图像平滑处理(滤波降噪)cv2.blur、cv2.boxFilter、cv2.medianBlur、cv2.GaussianBlur、cv2.bilateralFilter

1. 均值滤波:cv2.blur(对象,核大小),如:blur = cv2.blur(img,(3,3)),该点对应核中中心,设定值为核大小范围内的所有值平均,边缘处理不详,如下:

2.方框滤波:类似均值滤波,最后一个参数Ture时取均值,为False时,取和。

3.中值滤波:cv2.medianBlur(对象,n),n为大于1的奇数。取中位数,边缘处理不详,如下:

 

4.高斯滤波(貌似用的很多):cv2.GaussianBlur(对象,核,0,0),核中心权重最大,周围依次下降,后面两个参数,可只设置一个,应该是X、Y轴的计算微调,网上说是标准差之类。

3X1的核,权重为25%、50%、25%。3X3核依次为:0.0625、​0.125、​0.0625、0.125、​0.25、​0.125、0.0625​、0.125、​0.0625。如果将差参数置1,会产生小量变化。

5.双边滤波:cv2.bilateralFilter(对象,n,0,0),n代表核大小,又有说直径范围,后两个参数分别代表颜色、位置的微调值(标准差)。计算方法不详,同时考虑距离和差值,过于复杂,反应慢。能很好的保留边缘信息。用法举例:cv2.bilateralFilter(gray,9,75,75)。

 6.网上小结: 

  • 在不知道用什么滤波器好的时候,优先高斯滤波cv2.GaussianBlur(),然后均值滤波cv2.blur()
  • 斑点和椒盐噪声优先使用中值滤波cv2.medianBlur()
  • 要去除噪点的同时尽可能保留更多的边缘信息,使用双边滤波cv2.bilateralFilter()
  • 线性滤波方式:均值滤波、方框滤波、高斯滤波(速度相对快)。
  • 非线性滤波方式:中值滤波、双边滤波(速度相对慢)。

四、图像边缘检测cv2.canny、cv2.sobel、cv2.Laplacian

1、cv2.Canny(对象,最小值,最大值),可选参数apertureSize=7,最大为7效果不错,线框闭合,对比如下:

apertureSize: aperture size for the Sobel operator.算子的孔径大小。 

<think>嗯,用户想了解表格识别获取单元格坐标的方法。首先,我需要理清楚整个流程,分步骤解释。可能涉及图像处理、深度学习模型,还有后处理步骤。 首先,表格识别通常是从图像或扫描文档中提取表格结构,对吧?所以第一步可能是预处理图像,比如灰度化、二值化、去噪这些操作,确保图像清晰。然后检测表格区域,可能需要边缘检测或者轮廓分析来找表格的外边框。 接下来,检测单元格的坐标。这里可能要用到目标检测模型,比如YOLO或者Faster R-CNN,这些模型可以识别每个单元格的位置。或者使用语义分割模型来分割出每个单元格的区域,再通过连通区域分析得到坐标。不过,用户可能更关心的是具体步骤,所以得详细说明。 另外,还有基于传统图像处理的方法,比如霍夫变换检测直线,找到水平和垂直线条,然后通过交叉点确定单元格的边界。这种方法可能在规则表格中效果好,但对于复杂或合并单元格的情况可能不太行,这时候就需要深度学习方法。 然后,获取坐标的具体方法,比如检测到单元格的四个顶点坐标,或者左上角和右下角的坐标。可能需要用OpenCV来处理图像,找到轮廓,计算外接矩形,然后得到坐标值。 还要考虑OCR的集成,识别出文字后,将文字内容与对应的单元格坐标关联起来,这样整个表格的结构和内容就都提取出来了。比如使用Tesseract或者PaddleOCR,它们可能自带表格识别功能,或者需要结合其他工具。 用户可能还关心实际应用中的挑战,比如表格线不清晰、合并单元格、倾斜或扭曲的表格,这些情况如何处理。可能需要更复杂的模型或者后处理算法,比如基于图神经网络的表格结构识别,或者使用注意力机制来理解单元格之间的关系。 最后,总结一下步骤:预处理、表格检测、单元格定位、坐标提取、OCR识别和结果整合。同时提到常用的工具和库,比如OpenCV、TensorFlow/PyTorch、PaddleOCR等,以及评估指标如IoU来衡量检测精度。</think>表格识别中获取单元格坐标的流程可分为以下步骤,结合传统图像处理与深度学习方法: 一、预处理阶段 1. 图像二值化:使用$threshold=128$进行全局阈值处理 2. 去噪滤波:采用中值滤波器$kernel=3\times3$ 3. 透视校正:通过霍夫变换检测倾斜角度$\theta$,应用仿射变换矩阵: $$ \begin{bmatrix} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{bmatrix} $$ 二、表格结构检测 1. 线检测方法: - 霍夫直线检测:参数空间$\rho = 1$, $\theta = \pi/180$ - 线段聚类:合并相似直线(角度差<$\pi/90$,距离差<5像素) 2. 深度学习方法: - 使用Mask R-CNN模型预测单元格区域 - 输出格式:边界框坐标$(x_{min}, y_{min}, x_{max}, y_{max})$ 三、坐标提取关键算法 1. 交点检测算法: - 建立直线方程:$ax + by + c = 0$ - 解线性方程组求交点: $$ \begin{cases} a_1x + b_1y = -c_1 \\ a_2x + b_2y = -c_2 \end{cases} $$ 2. 轮廓分析法: ```python contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) cells.append( (x, y, x+w, y+h) ) ``` 四、坐标修正策略 1. 对齐校正:将坐标映射到网格系统 $$ x' = \text{round}(x / grid\_size) \times grid\_size $$ 2. 合并相邻单元格:当满足 $$ |y_2 - y_1| < threshold \quad \text{且} \quad |x_2^{right} - x_1^{left}| < overlap\_threshold $$ 五、评估指标 使用IoU(交并比)验证坐标精度: $$ IoU = \frac{Area_{overlap}}{Area_{union}} $$ 当$IoU > 0.9$时判定为正确检测 实际应用建议: 1. 复杂表格优先选用深度学习方案(如TableNet、CascadeTabNet) 2. 规则表格可采用OpenCV+DNN混合方案 3. 输出建议使用XML或JSON格式存储坐标信息 典型工具链组合: 扫描仪 → OpenCV预处理 → PaddleOCR检测 → Tesseract文字识别 → XML输出 该技术已广泛应用于财务报表识别、医疗表格数字化等领域,准确率可达92%以上(ICDAR数据集测试结果)。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值