Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

Python识别图片特定区域的文字



现在我在做基于yolo的自动化测试框架,目前能识别出按钮button、输入框input等控件。但是会遇到一个情况,当前手机屏幕上或者网页上会出现多个按钮,虽然能识别出多个按钮,但是要点击哪一个呢,于是需要一个界定,首要的判断条件就是依据button上或者附近的文本。

现在用到yolo时除了能识别出对应的控件类型,并能获取到控件区域,有了这些前提那么识别文本就比较简单了。

可以用到opencv-python,pytesseract,首先安装:

pip install opencv-python
pip install pytesseract

(yolo相关的可以看站内其他文章,下面的样例仅是关于图片区域中文字的识别)

对于单图片,可以用opencv来读取图片并找到文字轮廓,获取到区域后再用pytesseract来识别文字。

比如现在有张简单的图片(下图可能上传时已压缩了)

用下面的代码即可识别出区域范围和文字:

import cv2
import pytesseract

# 读取图片
img = cv2.imread("./py_recognize_pure_text.png")

# 将图片灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# OTSU threshold 大津阈值法处理一下
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

# shape是卷积核形状,这里的MORPH_RECT是矩形;size是卷积核尺寸,这里是(18,18)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (18, 18))

# 对特定结构做膨胀处理
dilation = cv2.dilate(thresh, rect_kernel, iterations=1)

# 寻找轮廓
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# 复制图像,以防对原图片造成修改
img_copy = img.copy()

# 循环找到的轮廓,并截取对应的区域,再分别进行识别
for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    print((x, y), (x + w, y + h))

    # 对复制的图像画出区域边框,如果需要后续保存的话
    rect = cv2.rectangle(img_copy, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 截取区域
    cropped = img_copy[y:y + h, x:x + w]

    # 识别文字
    text = pytesseract.image_to_string(cropped)
    print(text.strip())

此时输出的内容正是图片上的文字和区域范围:

(133, 174) (583, 212)
it is raining outside, we have to stay at home
(30, 38) (237, 72)
This is one line text

如果要指定截取某大图的部分区域,指定范围即可,这样在识别到控件类型后再根据识别到的区域来截取并识别文字就很简单了,button到底是login还是continue就变得非常容易。

import cv2
import pytesseract

img = cv2.imread("./login.png")  # 实际上不需要再保存文件,直接传递值就行了
y = 550
x = 180
h = 50
w = 400
crop_img = img[y:y+h, x:x+w].copy()
text = pytesseract.image_to_string(crop_img)
print(str(text))
cv2.imshow("cropped", crop_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果遇到这种错误:'cv2.error: OpenCV(4.5.1) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-39p1qqfs/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'', 那么试着把图片文件放到程序当前目录下试试。

reference: https://www.geeksforgeeks.org/text-detection-and-extraction-using-opencv-and-ocr/

下一篇:  用docker给centos镜像装python3以及上传artifacts
上一篇:  Darknet YOLO v4 训练自定义数据集

共有1条评论

添加评论

fydcr
2022年3月14日 10:09
怎么没人评论?