前言
C#版本的方法介绍
https://www.psvmc.cn/article/2022-07-18-opencv-csharp.html
安装依赖
1 | pip install opencv-python==4.5.4.60 |
图片信息
查看图片
1 | image = cv2.imread('D:\\Project\\csharp\\z-exam-card-recognize\\ml-resource\\1202_1.png') |
读取支持中文路径
1 | import cv2 |
这个函数就可以代替opencv的imread了,并且该函数支持中文路径
图片保存
这种方式存在路径中有中文无法保存的问题
1 | page_word_folder = 'D:\\Project\\csharp\\z-exam-card-recognize\\ml-resource\\page_word' |
如果路径中有中文无法保存,使用下面的方式就可以了
1 | file_path = os.path.join(paper_word_folder, f"{row + 1}行_{col + 1}列.png") |
图片数据展平
1 | word20Img.flatten() |
获取图片大小
1 | height, width = image.shape[:2] |
获取图片Base64
1 | import cv2 |
内存释放
在 Python 中使用 OpenCV 加载图像(或创建其他类型的 cv2.Mat
对象)时,通常不需要显式释放内存,因为 Python 的垃圾回收机制会自动管理内存。
然而,如果你确实需要确保某些资源被释放,可以采取一些措施。
例如:使用 del
语句(适用于图像或矩阵)
对于图像矩阵(cv2.Mat
),你可以使用 del
语句来删除引用,这样垃圾回收器会在适当的时候回收内存:
1 | import cv2 |
图片处理
二值化
二值化的前提是图片进行灰度化
1 | # 将图像二值化 |
判断图片是否二值化
1 |
|
腐蚀与膨胀
1 | # 腐蚀操作 扩大黑色 |
旋转
1 |
|
图片拼接
1 | import cv2 |
二值化处理方式
在文字识别(OCR,Optical Character Recognition)中,选择合适的阈值处理方法取决于图像的质量、背景复杂度以及光照条件。
二值化的前提是图片进行灰度化
以下是几种常见的阈值处理方法及其在文字识别中的适用场景:
简单阈值处理
这是最基本的阈值处理方法。你需要手动指定一个阈值,然后根据这个阈值将图像二值化。
cv2.THRESH_BINARY
:如果像素值大于阈值,则设置为最大值,否则设置为 0。cv2.THRESH_BINARY_INV
:与cv2.THRESH_BINARY
相反,如果像素值大于阈值,则设置为 0,否则设置为最大值。
适用场景:适用于光照均匀、背景简单的图像。
优点:简单直接,对于背景和前景对比明显的图像效果较好。
示例代码:
1 | ret, bin_image_binary = cv2.threshold(image, 200, 255, cv2.THRESH_BINARY) |
反相
1 | ret, bin_image_binary_inv = cv2.threshold(image, 128, 255, cv2.THRESH_BINARY_INV) |
三角法阈值处理
cv2.THRESH_TRIANGLE
三角法阈值处理(Triangle Thresholding)是一种自动确定阈值的方法,它使用图像直方图的峰值和谷值来计算阈值。
在扫描仪效果不太好的前提下,这种方式的识别效果最好。
适用场景:适用于具有单峰直方图的图像,例如某些特定的扫描文档或低对比度图像。
优点:自动计算阈值,适用于某些特定场景。
示例代码:
1 | # 三角法阈值处理 |
大津法阈值处理
cv2.THRESH_OTSU
适用场景:适用于具有双峰直方图的图像,尤其是文档扫描件或具有清晰背景和前景的图像。
优点:自动计算最佳阈值,不需要手动调整。
示例代码:
1 | import cv2 |
自适应阈值处理
自适应阈值处理方法会根据图像的不同区域计算不同的阈值。
扫描仪不推荐使用这种方式,效果非常不好。
适用于光照不均匀的图像。
cv2.ADAPTIVE_THRESH_MEAN_C
:阈值是邻域像素的平均值减去一个常数。cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:阈值是邻域像素的加权和(高斯加权)减去一个常数。
适用场景:适用于光照不均匀的图像,例如自然场景中的文字或低质量扫描文档。
优点:根据局部区域的光照条件调整阈值,适合处理光照不均匀的图像。
示例代码:
1 | import cv2 |
总结
- 扫描图片背景基本一样:简单阈值处理(
cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
)。 - 扫描图片直方图为双峰:通常使用大津法阈值处理(
cv2.THRESH_OTSU
)效果较好。 - 扫描图片直方图为单峰:三角法阈值处理(
cv2.THRESH_TRIANGLE
)。 - 光照不均匀的图像:自适应阈值处理(
cv2.ADAPTIVE_THRESH_MEAN_C
或cv2.ADAPTIVE_THRESH_GAUSSIAN_C
)更适合。
注意
在做阅卷识别的时候,还是建议用
cv2.THRESH_BINARY
的方法,其他几种方式自动获取的阈值会变动,导致同样的试卷多次扫描的结果会不一致。
图片绘制
绘制矩形
1 | import cv2 |
绘制中文乱码
由于OpenCV的字体渲染机制不直接支持Unicode字符(包括中文),因此无法直接绘制中文。
Pillow库可以直接支持中文绘制,因此你可以将Pillow和OpenCV结合使用来绘制包含中文的文字。
1 | pipenv install pillow==8.4.0 |
脚本同级目录添加字体文件simsun.ttc
方法
1 | import cv2 |
也可以使用系统自带的字体
1 | import cv2 |
图像识别
1 | import cv2 |
工具类
1 | import base64 |