适合 MacBook 用户的 Python OCR 推荐

힘센캥거루
2025년 10월 13일(수정됨)
41
python

为了识别学生的医疗诊断证明,我几乎尝试了所有的OCR。

我使用过 Tesseract、EasyOCR、PaddleOCR 等各种OCR,但没有一个对韩语的性能让我满意。

不过最近我发现了一个包装了MacBook上实时文本功能的Python库。

这是利用苹果公开的 Vision Framework API。

1. Vision Framework

上传的图片

Vision Framework 是苹果从 High Sierra 开始面向开发者公开的机器视觉框架

提供图像分类、排序、文本识别、面部识别等各种API。

因为是设备自带的,所以不需要互联网连接。

如果用纯 swift 实现,可以如下使用。

import Foundation
import Vision
import AppKit

func loadNSImage(_ path: String) -> NSImage? {
    return NSImage(contentsOfFile: path)
}

func cgImage(from nsImage: NSImage) -> CGImage? {
    var rect = CGRect(origin: .zero, size: nsImage.size)
    return nsImage.cgImage(forProposedRect: &rect, context: nil, hints: nil)
}

let args = CommandLine.arguments
guard args.count >= 2 else {
    fputs("Usage: ocr <image_path> [lang1,lang2,...] [roi]\n", stderr)
    exit(1)
}
let imagePath = args[1]
let langs = args.count >= 3 ? args[2].split(separator: ",").map { String($0) } : ["ko-KR","en-US"]

// ROI: "x,y,w,h" in 0~1 (optional)
var roi: CGRect? = nil
if args.count >= 4 {
    let comps = args[3].split(separator: ",").compactMap { Double($0) }
    if comps.count == 4 {
        roi = CGRect(x: comps[0], y: comps[1], width: comps[2], height: comps[3])
    }
}

guard let nsImage = loadNSImage(imagePath), let cg = cgImage(from: nsImage) else {
    fputs("Failed to load image\n", stderr)
    exit(1)
}

let request = VNRecognizeTextRequest { request, error in
    if let error = error {
        fputs("Error: \(error.localizedDescription)\n", stderr)
        exit(1)
    }
    let observations = request.results as? [VNRecognizedTextObservation] ?? []
    for obs in observations {
        if let top = obs.topCandidates(1).first {
            print(top.string)
        }
    }
}

// 核心选项
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true
request.recognitionLanguages = langs
request.customWords = [] // 如果需要,添加领域词典

if let r = roi {
    request.regionOfInterest = r
}

// 如果支持最新版本,将自动使用(如需显式,使用以下行)
// request.revision = VNRecognizeTextRequestRevision3 // 根据OS调整

let handler = VNImageRequestHandler(cgImage: cg, options: [:])
do {
    try handler.perform([request])
} catch {
    fputs("Perform error: \(error.localizedDescription)\n", stderr)
    exit(1)
}

然后在终端中编译并运行。

xcrun swiftc ocr.swift -o ocr
./ocr sample.png "ko-KR,en-US"
上传的图片

识别率和速度都非常惊人。

使用 EasyOCR 时读取一张图像需要超过3秒,而使用 Vision Framework 一秒可以处理2张图像。

搜索后发现有人已经做了一个 Python 库。

2. ocrmac

果然有人好心地用 Python 包装好了API。

我们可以用 pip 下载并使用。

pip install ocrmac 

然后尝试识别一个样本图像。

开始时字符识别效果不好,但指定目标语言后识别率大大提高。

from ocrmac import ocrmac
import matplotlib.pyplot as plt

img_path = './pdf2png/scan0.png'
result = ocrmac.OCR(img_path, language_preference=["ko-KR","en-US"]).recognize()
for line in result:
    print(line)

第一个值是文字,第二个值是准确性,第三个值是边界框。

上传的图片

通常用 cv2 绘制边界框,但这个库直接绘制。

可以用如下方式使用 annotation_PIL。

from ocrmac import ocrmac
import matplotlib.pyplot as plt

img_path = './pdf2png/scan0.png'
result = ocrmac.OCR(img_path, language_preference=["ko-KR","en-US"])
img  = result.annotate_PIL()
plt.figure(figsize=(12,12))
plt.imshow(img)
上传的图片

框架可以选择为livetext或改变识别等级。

可以使用以下示例了解更多详细信息。

3. 使用心得

使用苹果的 Vision Framework,让我对OCR的渴望一次性得到了满足。

处理 200dpi 的 100 张图像,EasyOCR 需要约10分钟,而 ocrmac 几乎在1分钟内完成。

可以考虑用这个做一个网络服务。

如果有人早点告诉我,我会更爱我的 MacBook ...

只是太晚知道,实在可惜。

댓글을 불러오는 중...