如何在突出显示的区域转录图像中的文本?

How to transcript text from image in the highlighted areas?

如何在 Python 中使用 Tesseract 转录下图中突出显示区域的文本?

从上到下。这些框大约在 (x1, y1, x2, y2)

  • 0.2564、0.1070、0.6293、0.166
  • 0.2377、0.6826、0.7645、0.703
  • 0.331、0.88、0.6713、0.913

相对于宽度和高度。完整的代码就像

import cv2
import pytesseract

image = cv2.imread('E5PY2.jpg')
coords = [[0.2564, 0.1070, 0.6293, 0.166],
          [0.2377, 0.6826, 0.7645, 0.703],
          [0.331, 0.88, 0.6713, 0.913]]
h, w, c = image.shape
for idx, (x1, y1, x2, y2) in enumerate(coords):
    x1 = int(x1 * w)
    x2 = int(x2 * w)
    y1 = int(y1 * h)
    y2 = int(y2 * h)
    print(pytesseract.image_to_string(image[y1:y2, x1:x2]))

假设突出显示区域有不同的颜色,其余图像中不存在这种颜色 - 例如示例中突出显示的突出红色 - 您可以使用颜色阈值 HSV color space incorporating cv2.inRange .

因此,您为色调、饱和度和明度设置了适当的下限和上限。在给定的示例中,我们正在检测红色。因此,一般来说,我们需要两组限制,因为偏红的颜色位于色相柱体的 0°/180°“转向”处。为了克服这个问题,并且只使用一组限制,我们将获得的色调通道移动 90°,并取 180° 的模数。此外,我们有高饱和度和非常明亮的红色,所以我们可能会看到饱和度水平高于 80%,价值水平高于 50%。我们得到这样一个面具:

最后要做的是从生成的蒙版中获取轮廓,获取相应的边界矩形,并对内容进行 运行 pytesseract(灰度化,使用 Otsu 进行阈值处理以获得更好的 OCR 性能) .我的建议是在这里也使用 选项。

这是包含结果的完整代码:

import cv2
import numpy as np
import pytesseract

# Read image
img = cv2.imread('E5PY2.jpg')

# Convert to HSV color space, and split channels
h, s, v = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))

# Shift hue channel to detect red area using only one range
h_2 = ((h.astype(int) + 90) % 180).astype(h.dtype)

# Mask highlighted boxes using color thresholding
lower = np.array([ 70, int(0.80 * 255), int(0.50 * 255)])
upper = np.array([110, int(1.00 * 255), int(1.00 * 255)])
highlighted = cv2.inRange(cv2.merge([h_2, s, v]), lower, upper)

# Find contours w.r.t. the OpenCV version; retrieve bounding rectangles
cnts = cv2.findContours(highlighted, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
rects = [cv2.boundingRect(cnt) for cnt in cnts]

# Iterate bounding boxes, and OCR
for x, y, w, h in rects:

    # Grayscale, and threshold using Otsu
    work = cv2.cvtColor(img[y:y+h, x:x+w], cv2.COLOR_BGR2GRAY)
    work = cv2.threshold(work, 0, 255, cv2.THRESH_OTSU)[1]

    # Pytesseract with -psm 6
    text = pytesseract.image_to_string(work, config='--psm 6')\
        .replace('\n', '').replace('\f', '')
    print('X: {}, Y: {}, Text: {}'.format(x, y, text))
    # X: 468, Y: 1574, Text: START MEDITATING
    # X: 332, Y: 1230, Text: Well done. By signing up, you’ve taken your first
    # X: 358, Y: 182, Text: Welcome

警告:我使用了 Mannheim University Library 的特殊版本的 Tesseract。

----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.19041-SP0
Python:        3.9.1
PyCharm:       2021.1.1
NumPy:         1.20.3
OpenCV:        4.5.2
pytesseract:   5.0.0-alpha.20201127
----------------------------------------