Python 表格图像中的文本检测
让我先说我不擅长这个(发帖问题),我是问题主题的初学者 明白了这一点,我正在进行一个OCR项目,该项目将检测姓名和数字。这篇文章的主题只涉及名字。目前,我正在尝试从图像中的表中提取名称 我的方法是处理一个图像并获得名称的边界框,然后我有两个想法,如何在不指定名称在图像中的位置的情况下自动处理其他图像 我已经设法在“名称”列上放置了边界框,但出于某种原因,它还检测每个单元格中名称字符周围的轮廓,我不得不删除很多数据,因为这对其他人来说是私人的,但我确实有使用它的权限 我有两个问题: 在角色周围检测到轮廓的原因可能是什么 您认为我应该如何自动化提取过程,因为我目前必须以静态方式指定边界的位置 使用的代码提供:Python 表格图像中的文本检测,python,opencv,computer-vision,ocr,Python,Opencv,Computer Vision,Ocr,让我先说我不擅长这个(发帖问题),我是问题主题的初学者 明白了这一点,我正在进行一个OCR项目,该项目将检测姓名和数字。这篇文章的主题只涉及名字。目前,我正在尝试从图像中的表中提取名称 我的方法是处理一个图像并获得名称的边界框,然后我有两个想法,如何在不指定名称在图像中的位置的情况下自动处理其他图像 我已经设法在“名称”列上放置了边界框,但出于某种原因,它还检测每个单元格中名称字符周围的轮廓,我不得不删除很多数据,因为这对其他人来说是私人的,但我确实有使用它的权限 我有两个问题: 在角色周围检测
import cv2
from matplotlib import pyplot as plt
import numpy as np
file = r'Corrected_images\table_deskew3.png'
table_image_contour = cv2.imread(file, 0)
table_image = cv2.imread(file)
ret, thresh_value = cv2.threshold(table_image_contour, 180, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((5, 5), np.uint8)
dilated_value = cv2.dilate(thresh_value, kernel, iterations=1)
contours, hierarchy = cv2.findContours(dilated_value, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
# bounding the
if 842 < x < 2215 and 1288 < y:
table_image = cv2.rectangle(table_image, (x, y), (x + w, y + h), (0, 0, 255), 3)
roi = table_image[y: y + h, x: x + w]
#plt.imshow(roi)
#plt.show()
plt.imshow(table_image)
plt.show()
cv2.imwrite('target.png', table_image)
cv2.namedWindow('detectable', cv2.WINDOW_NORMAL)
导入cv2
从matplotlib导入pyplot作为plt
将numpy作为np导入
file=r'Corrected_images\table_deskew3.png'
表\u图像\u轮廓=cv2.imread(文件,0)
表_image=cv2.imread(文件)
ret,thresh\u value=cv2.阈值(表\u图像\u轮廓,180,255,cv2.thresh\u二进制\u INV)
内核=np.one((5,5),np.uint8)
扩张的_值=cv2。扩张(阈值,核,迭代次数=1)
等高线,层次=cv2.findContours(扩展的_值,cv2.RETR_树,cv2.CHAIN_近似_简单)
对于轮廓中的cnt:
x、 y,w,h=cv2.boundingRect(cnt)
#边界
如果842
使用RETR.TREE时,所有白色区域都会找到轮廓。也就是说,它在等高线中获得等高线的层次结构。因此,通常需要确保要查找的对象是白色的。然后,如果它们不是外部(或外部)轮廓,则需要通过某种方法(通常是面积或周长或尺寸)对其进行过滤,或者可以按层次进行过滤。您是要获取文本还是列和行行?如果是文本,那么在提取轮廓之前,您可以尝试使用形态学删除长的水平线和垂直线。@fmw42我正在尝试获取整个列,因为所有单元格的大小都相同,这会更好。或者我可以删除表格边框和线条,然后将文本(前景)置为白色,将背景置为黑色,然后对文本进行拨号,使其合并在一起排序,然后应用束框,获取它们的位置,然后在原始图片上裁剪它们?这似乎是个更好的主意吗?单元格的区域比每个字符都大-区域=宽度*高度-
,您可以使用它来过滤它。还有cv2.contourArea()
和cv2.minareact()