【Python实战】如何优雅地实现文字 & 二维码检测?

前几篇,和大家分享了如何通过 Python 和相关库,自动化处理 PDF 文档,提高办公效率。

实操的同学发现,无论是 fitz 还是 PyPDF2 都无法搞定图片中的文字 & 二维码。

今天,继续给大家分享两个库,完美解决上述问题,亲测好用。

1. 文字检测-PPOCR

文字检测OCR(光学字符识别)广泛应用于文档数字化、自动化数据输入、车牌识别等领域。现代 OCR 利用深度学习和图像处理算法,能够处理各种字体和语言。随着 AI 的发展,OCR 的准确率和处理速度已近乎完美。

本文采用的是 PPOCR 这个库,来自百度飞桨团队,模型轻量,处理速度也相当感人。

1.1 安装

安装也非常简单,因为依赖 paddlepaddle,所以需要一并安装:

pip install paddlepaddle==2.6.1
pip install paddleocr

1.2 调用

安装完成后,几行代码实现调用:

def img_ocr(img_path=None, img_data=None):
    if img_data is not None:
        img = img_data
    else:
        img = cv2.imread(img_path)
    result = ppocr.ocr(img, cls=True)[0]
    texts = []
    if result:
        for line in result:
            box = line[0]
            text = line[1][0]
            texts.append([text, box])
    return texts

注意:首次使用,paddleocr 会将模型下载到你的本地目录:C:\Users\xxx\.paddleocr\,后续使用将直接调用本地模型。

我们随便找一张图片来测试下:

将结果打印出来:

❌第二行出现了一个识别错误:江苏手机阅读显,把二维码识别成了,看来单纯靠 OCR 还是不太可靠😂~

✔️看来还得用 GPT 来排查一下文字错误。

2. 二维码检测-pyzbar

二维码应该说是一种标准化的信息存储方式,通常由黑白方块组成,广泛应用于支付、商品追踪和信息共享等场景。

展示在图像中,二维码检测具有非常显著的特点,但因为二维码形式多样,简单的图像处理方法无法很好地识别各种类型二维码。

这里我们采用 pyzbar 这个库,实现二维码检测。

2.1 安装

安装这里有个坑,尝试了两种方式,都无法调用成功。

一开始尝试 pip 安装:

pip install pyzbar

报错提示依赖库没有成功安装,尝试了 conda 安装:

conda install -c conda-forge pyzbar # 还是失败

最终在官方仓库中找到解决方案:需要安装 vcredist_x64.exe

再次调用就没问题了。

2.2 调用

示例代码如下:

def qrcode_detect(image, left=0.12, right=1.12, top=0.15, bottom=1.25):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    codes = decode(gray_image)
    results = [] 
    for code in codes:
        x, y, w, h = code.rect.left, code.rect.top, code.rect.width, code.rect.height
        results.append([x, y, w, h])
    return image

codes 中包含了所有的二维码信息,包括二维码中编码的 url/文本等信息。

我们把检测结果打印出来看下:

写在最后

本文给大家带来了一种最简单的文字 & 二维码检测方法,亲测在白底黑字的文档场景中有效。

欢迎有其他解决方案的小伙伴,评论区交流下啊~

如果本文对你有帮助,欢迎点赞收藏备用。

### 提高Python二维码识别准确率的方法 #### 1. 图像预处理提升识别准确性 为了增强图像质量,可以采用多种方法来改善输入图片的质量。灰度化、二值化以及去噪操作能够有效减少干扰因素,从而提高识别成功率。 ```python import cv2 def preprocess_image(image_path): image = cv2.imread(image_path) # 转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)[^1] # 应用自适应阈值处理得到二值图像 binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return binary ``` #### 2. 利用OpenCV检测并矫正倾斜角度 当二维码存在旋转情况时,直接解码可能会失败。因此,在尝试解析之前先找到四个角点,并对其进行透视变换校正位置偏差有助于增加成功几率。 ```python def correct_perspective(binary_img): contours, _ = cv2.findContours(binary_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contour = max(contours, key=cv2.contourArea) rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) box = np.int0(box) width = int(rect[1][0]) height = int(rect[1][1]) dst_pts = [[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]] src_pts = order_points(box) M = cv2.getPerspectiveTransform(src_pts.astype(np.float32), np.array(dst_pts).astype(np.float32)) warped = cv2.warpPerspective(binary_img, M, (width, height)) return warped def order_points(pts): """Sorts the points based on their x and y coordinates.""" pts = sorted(pts.tolist(), key=lambda p: sum(p))[:4] top_left = min(pts, key=lambda p: abs(sum(p))) bottom_right = max(pts, key=lambda p: abs(sum(p))) remaining = set(tuple(map(tuple, pts))) ^ {tuple(top_left)} ^ {tuple(bottom_right)} top_right = min(remaining, key=lambda p: p[0]) bottom_left = next(iter(set(remaining) ^ {top_right})) return [list(top_left), list(top_right), list(bottom_right), list(bottom_left)] ``` #### 3. 结合PyZBar库完成最终解码过程 经过上述步骤之后,现在可以安全地调用`pyzbar.decode()`函数来进行实际的数据读取工作了。此阶段会返回包含所提取信息的对象列表;如果未能发现任何有效的条形码/二维码,则为空数组[]。 ```python from pyzbar import pyzbar def decode_qr_code(warped_img): decoded_objects = pyzbar.decode(warped_img) result = [] for obj in decoded_objects: data = obj.data.decode('utf-8') type_ = obj.type result.append({ 'data': data, 'type': type_ }) return result or None ``` 通过以上三个环节——即图像预处理、视角纠正及最后借助第三方工具包执行具体编码转换任务——可以在很大程度上改进基于Python环境下的二维码识读性能表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值