在数字化时代,数据湖的构建已成为企业获取洞察力的关键。特别是在食品行业,从产品信息到营养成分的大量数据收集变得尤为重要。然而,许多营养成分信息是以图像形式存在,而非文本,这给传统的网络爬虫技术带来了挑战。本文将探讨如何利用光学字符识别(OCR)技术,特别是Tesseract和PyTesseract,来从图像中提取营养信息。
在OCR技术领域,Tesseract是一个领先的开源引擎,由Google拥有,遵循Apache 2.0许可协议。Tesseract最初由HP使用C语言开发,现在已经成为OCR领域的一个标准工具。随着Python语言的流行,社区开发了一个名为PyTesseract的包装器,它包含了原始项目的所有特性,并且可以在GitHub上找到,也可以通过Python Package Index (PyPI)使用。
在项目初期,面临的挑战是如何从图像中读取营养成分表。这些表格中的文字常常被水平线和垂直线分隔,这给机器阅读带来了困难。目标是去除这些线条,只保留文字和数值,以减少机器的注意力分散。为了解决这个问题,采取了两个步骤。首先,使用水平和垂直核来识别线条的位置,生成二值化图像。这一步骤使用了OpenCV,这是一个完整的、非常流行的Python图像库。
def remove_lines(image, colors):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
bin_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
h_contours = get_contours(bin_image, (25, 1))
v_contours = get_contours(bin_image, (1, 25))
for contour in h_contours:
cv2.drawContours(image, [contour], -1, colors[0][0], 2)
for contour in v_contours:
cv2.drawContours(image, [contour], -1, colors[0][0], 2)
return image
一旦识别出这些线条,如何从图像中删除它们呢?答案是K-means,这是一个无监督的机器学习算法,通常用于聚类。K-means不需要外部输入,只需要确定K值,即问题所需的聚类数量。
在这个阶段,还没有实现机器阅读,但使用了EAST,这是一个开源的场景文本检测器,其代码可以在GitHub上找到。在本项目中,EAST被用来进一步简化机器的工作,去除干扰,专注于图像文本。EAST本身只定位文本的位置,并不读取文本,这可以类比为一个文盲,他知道那里有文本,但不知道写了什么。
from nkocr import OcrTable
text = OcrTable("paste_image_url_here")
print(text) # or print(text.text)