在本文中,将探讨如何利用计算机视觉技术从图像中提取文字,并使用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模块。如果希望在笔记本中安装它,可以使用以下命令。
!pip install pytesseract
如果已经安装了Pytesseract和Pillow库,那么可以跳过这一步。
! apt install tesseract-ocr libtesseract-dev libmagickwand-dev
将导入IPython函数来清除不需要的输出。
from IPython.display import HTML, clear_output
clear_output()
现在,将安装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,也会出现错误。
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格式以进一步处理它。当需要从复杂图像中提取文字时,这是必需的。
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)