如何在突出显示的区域转录图像中的文本?
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
----------------------------------------
如何在 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
----------------------------------------