我不知道你的真实意图,你是想只看文字还是要提取部分内容?
无论如何,我将向您展示一个直接且通用的解决方案。取你需要的零件,最后找到孔码。
你需要 4 个模块:
cv2 (openCV) 用于图像处理
numpy 用于处理图像上的特殊操作
pytesseract 用于识别文本(ocr)
pillow (pil) 为 pytesseract 准备图像
加载和过滤器
您的原图:
首先我们减少除红色以外的所有颜色。 lower 和 upper 描述了我们喜欢过滤的 BGR(RGB = 红、绿、蓝)的值。
image = cv.imread("AR87t.jpg")
lower = np.array([0, 0, 200])
upper = np.array([100, 100, 255])
shapeMask = cv.inRange(image, lower, upper)
cv.imshow("obj shapeMask", shapeMask)
cv.waitKey(0)
这表明:
寻找轮廓
接下来,我们找到轮廓并迭代。如果我们找到 4 个角,我们将做接下来的事情......
cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL,
cv.CHAIN_APPROX_SIMPLE)[0]
for c in cnts:
peri = cv.arcLength(c, True)
approx = cv.approxPolyDP(c, 0.04 * peri, True)
if len(approx) == 4:
....
屏蔽原件
使用boundingRect,我们提取x、y、w、h
(x, y, w, h) = cv.boundingRect(approx)
cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5)
面具上的 ocr
魔法来了!首先,我们提取掩码部分并将 openCV 图像导出为 PIL 图像。然后我们就可以运行 tesseract。
el = shapeMask.copy()[y:y + h, x:x + w]
pil_im = Image.fromarray(el)
cv.imshow("obj", el)
cv.waitKey(0)
print(pytesseract.image_to_string(pil_im))
这会将每个矩形显示为小图像。您的控制台将打印出:
L2 = 33,33
L3 = 44,44
L1 = 12,22
代码
import cv2 as cv
import numpy as np
import pytesseract
from PIL import Image
image = cv.imread("AR87t.jpg")
lower = np.array([0, 0, 200])
upper = np.array([100, 100, 255])
shapeMask = cv.inRange(image, lower, upper)
cv.imshow("obj shapeMask", shapeMask)
cv.waitKey(0)
cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL,
cv.CHAIN_APPROX_SIMPLE)[0]
for c in cnts:
peri = cv.arcLength(c, True)
approx = cv.approxPolyDP(c, 0.04 * peri, True)
if len(approx) == 4:
(x, y, w, h) = cv.boundingRect(approx)
cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5)
print("w:%s, y:%s, w:%s, h:%s" % (x, y, w, h))
el = shapeMask.copy()[y:y + h, x:x + w]
pil_im = Image.fromarray(el)
cv.imshow("obj", el)
cv.waitKey(0)
print(pytesseract.image_to_string(pil_im))
cv.imshow("obj rectangle", image)
cv.waitKey(0)