如何检测识别药敏纸片裁剪图中任意朝向文本并完成OCR提取?
抗生素药敏纸片文本朝向检测与校正最佳实践
一、文本朝向检测方法
- OCR引擎内置检测:使用Tesseract的
image_to_osd方法直接获取文本方向(含旋转角度),配合--psm 0参数可专门做方向与脚本检测;云OCR服务(如Google Cloud Vision、AWS Textract)的方向检测API准确率更高,适合复杂光照或模糊场景。 - 计算机视觉特征分析:通过OpenCV提取文本轮廓,计算轮廓最小外接矩形的旋转角度,统计高频角度作为整体朝向;或用霍夫变换检测文本行的倾斜方向,适合无OCR依赖的轻量化场景。
- 深度学习模型:采用轻量文本方向检测模型(如EAST扩展模型、CRNN变种),批量处理时准确率优于传统方法,适合大规模样本场景。
二、图像旋转校正工具
- OpenCV:通过
cv2.getRotationMatrix2D生成旋转矩阵,结合cv2.warpAffine实现任意角度旋转;可通过计算旋转后图像的边界尺寸,避免黑边遮挡文本。 - PIL/Pillow:用
Image.rotate()快速实现旋转,支持指定填充色(如白色)处理黑边,适合简单场景的快速校正。 - Tesseract联动校正:基于
image_to_osd返回的角度直接旋转图像,再用Tesseract进行OCR,减少工具切换成本。
三、针对圆形药敏纸片的稳健工作流
- 图像预处理:将裁剪后的图像灰度化→自适应二值化(适配纸片光照不均)→中值滤波去噪,突出文本轮廓。
- 圆形区域掩码:利用霍夫圆检测(
cv2.HoughCircles)或图像尺寸生成圆形掩码,仅保留圆形内的文本区域,过滤背景干扰。 - 朝向检测:优先用Tesseract的
image_to_osd获取旋转角度;若检测失败, fallback到轮廓分析统计高频角度。 - 图像校正:根据检测到的角度旋转图像,调整边界尺寸去除黑边,确保文本区域完整可读。
- OCR提取:用校正后的图像执行OCR,设置
--psm 6(单一文本块模式)+对应语言参数(如-l eng)提升准确率。
示例代码片段(Python)
import cv2 import pytesseract import numpy as np # 读取裁剪后的药敏纸片图像 img = cv2.imread("antibiotic_disc.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 预处理:自适应二值化+去噪 thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) thresh = cv2.medianBlur(thresh, 3) # 生成圆形掩码(适配正方形裁剪图) height, width = thresh.shape mask = np.zeros((height, width), dtype=np.uint8) cv2.circle(mask, (width//2, height//2), min(width, height)//2, 255, -1) masked_img = cv2.bitwise_and(thresh, thresh, mask=mask) # 检测文本朝向 osd_result = pytesseract.image_to_osd(masked_img) rotation_angle = int(osd_result.split("Orientation in degrees: ")[1].split("\n")[0]) # 校正图像(处理黑边) if rotation_angle != 0: center = (width//2, height//2) rot_mat = cv2.getRotationMatrix2D(center, rotation_angle, 1.0) # 计算旋转后图像的新尺寸 cos_val = np.abs(rot_mat[0, 0]) sin_val = np.abs(rot_mat[0, 1]) new_w = int((height * sin_val) + (width * cos_val)) new_h = int((height * cos_val) + (width * sin_val)) # 调整旋转矩阵的偏移量 rot_mat[0, 2] += (new_w / 2) - center[0] rot_mat[1, 2] += (new_h / 2) - center[1] corrected_img = cv2.warpAffine(masked_img, rot_mat, (new_w, new_h), borderValue=255) # 提取文本 ocr_text = pytesseract.image_to_string(corrected_img, config="--psm 6 -l eng") print("提取的药敏文本:", ocr_text.strip())
内容的提问来源于stack exchange,提问作者Zahidul Islam
相关产品推荐
相关产品推荐

