图像中的文字提取技术

在本文中,将探讨如何利用计算机视觉技术从图像中提取文字,并使用OpenCV的基本功能来增强文字,以便获得更准确的结果。这项技术对于大型组织来说非常有用,因为它可以节省从图像中输入文字的时间和劳力。

它还可以开启“无纸化文档”的世界,有助于提升存储效率。此外,它还可以帮助自动化进程,因为它可以直接从图像中提取文字。将导入请求库,以获取git文件和图像的URL。

导入请求库

import requests

接下来,将下载Tesseract OCR文件,这是Pytesseract库运行所必需的,并将其保存在open()函数中的路径。

r = requests.get("https://raw.githubusercontent.com/tesseract-ocr/tessdata/4.00/ind.traineddata", stream = True) with open("ind.traineddata", "wb") as file: for block in r.iter_content(chunk_size = 1024): if block: file.write(block)

现在,将安装Pytesseract模块。如果希望在笔记本中安装它,可以使用以下命令。

安装Pytesseract模块

!pip install pytesseract

如果已经安装了Pytesseract和Pillow库,那么可以跳过这一步。

安装OCR所需的库

! apt install tesseract-ocr libtesseract-dev libmagickwand-dev

将导入IPython函数来清除不需要的输出。

导入IPython以清除输出

from IPython.display import HTML, clear_output clear_output()

现在,将安装Pytesseract和OpenCV库,这些是文本识别的核心。

安装Pytesseract和OpenCV

! pip install pytesseract wand opencv-python clear_output()

将打开一张图像,调整其大小,然后再次保存它以供进一步使用,并可视化它。

读取图像并调整大小

image = Image.open(requests.get('https://i.stack.imgur.com/pbIdS.png', stream=True).raw) image = image.resize((300,150)) image.save('sample.png') image

设置Tesseract的路径。如果系统配置中没有设置路径,即使安装了Tesseract,也会出现错误。

设置Tesseract路径

pytesseract.pytesseract.tesseract_cmd = r'C:Program FilesTesseract-OCRtesseract.exe'

在这里,将使用自定义配置从图像中提取文字。

从图像中提取文字

custom_config = r'-l eng --oem 3 --psm 6' text = pytesseract.image_to_string(image,config=custom_config) print(text)

在自定义配置中,可以看到“eng”表示英语,即它将识别英文字母。也可以添加多种语言,而“PSM”意味着页面分割,它设置了如何识别字符块的配置,而“OEM”是默认配置。

现在将从提取的文字中移除不需要的符号,通过将符号替换为空字符串。

移除不需要的符号

try: text=pytesseract.image_to_string(image,lang="eng") characters_to_remove = "!()@—*“>+-/,'|£#%$&^_~" new_string = text for character in characters_to_remove: new_string = new_string.replace(character, "") print(new_string) except IOError as e: print("Error (%s)." % e)

在下面的单元格中,将图像读入OpenCV格式以进一步处理它。当需要从复杂图像中提取文字时,这是必需的。

将图像读入OpenCV格式

image = cv2.imread('sample.png') # 将以数组格式读取

将图像转换为灰度图像,这样处理起来就不太复杂了,因为它只有两个值0和1。这里使用cv2.cvtColor()方法将彩色图像转换为灰度格式,cv2.cvtColor实际上可以帮助150种颜色转换。

将图像转换为灰度图像

def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) gray = get_grayscale(image) Image.fromarray(gray)

现在将对图像进行模糊处理,以便从图像中移除噪声。这里,使用cv2.medianBlur()函数,目的是减少图像中的噪声,模糊处理本质上是通过应用相关的平滑滤波器来平滑图像,这是图像处理中广泛使用的方法之一。

移除图像中的噪声

def remove_noise(image): return cv2.medianBlur(image,5) noise = remove_noise(gray) Image.fromarray(gray)

将执行阈值转换。cv2阈值处理的工作原理很简单,即当像素值低于给定的阈值时,颜色为白色,否则像素颜色就是相反的黑色。使用的函数是cv2.threshold。

执行阈值转换

def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] thresh = thresholding(gray) Image.fromarray(thresh)

在这里,执行腐蚀转换。腐蚀转换是图像转换中最重要和最基本的步骤之一,它通常适合于填充图像中缺失的形状和格子,这有助于在图像稍微模糊或扭曲时识别图像中的文字。这里使用cv2库中的erode()函数进行腐蚀转换。

执行腐蚀转换

def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) erode = erode(gray) Image.fromarray(erode)

在这里,将执行形态学转换。形态学转换是最适合二值图像的技术之一,它根据图像的像素值而不是数值对图像进行排序,同时考虑到阈值。

执行形态学转换

def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) opening = opening(gray) Image.fromarray(opening)

在这里,尝试匹配图像。由于传递的是相同的图像进行匹配,得到了99.99%的相似度。模板匹配是一种在较大的图像中搜索和找到模板图像位置的方法。对于模板匹配,使用cv2库中的matchTemplate()函数。

模板匹配

def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) match = match_template(gray, gray) match

现在将通过在每个字符周围创建一个矩形来分离文本中的每个字符。

img = cv2.imread('sample.png') h, w, c = img.shape boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) Image.fromarray(img)

最后,可以在特定模式或单词周围绘制矩形。

img = cv2.imread('sample.png') d = pytesseract.image_to_data(img, output_type=Output.DICT) keys = list(d.keys()) date_pattern = 'artificially' n_boxes = len(d['text']) for i in range(n_boxes): if float(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) Image.fromarray(img)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485