济南网站优化收费,台州市网站制作,做电商需要什么条件,宝安中心医院是三甲吗导入环境
导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库#xff0c;用于图像处理。
import numpy as np
import argparse
import cv2设置命令行参数
ap argparse.ArgumentParser()
ap.add_argument(-i, --imag…导入环境
导入必要的库 numpy: 用于处理数值计算。 argparse: 用于处理命令行参数。 cv2: OpenCV库用于图像处理。
import numpy as np
import argparse
import cv2设置命令行参数
ap argparse.ArgumentParser()
ap.add_argument(-i, --image, defaultimages/page.jpg, helpPath to the image to be scanned)
args vars(ap.parse_args())定义坐标排序函数
对四个坐标点进行排序确定文档的四个角左上右上右下左下。 使用欧氏距离来计算和排序点。
def order_points(pts):# 一共4个坐标点rect np.zeros((4, 2), dtype float32)# 按顺序找到对应坐标0123分别是 左上右上右下左下# 计算左上右下s pts.sum(axis 1)rect[0] pts[np.argmin(s)]rect[2] pts[np.argmax(s)]# 计算右上和左下diff np.diff(pts, axis 1)rect[1] pts[np.argmin(diff)]rect[3] pts[np.argmax(diff)]return rect此函数用于排序提供的四个点确保点的顺序为左上、右上、右下和左下这对后续的透视变换非常重要。
定义透视变换函数
使用cv2.getPerspectiveTransform和cv2.warpPerspective来计算变换矩阵并应用
def four_point_transform(image, pts):# 获取输入坐标点rect order_points(pts)(tl, tr, br, bl) rect# 计算输入的w和h值widthA np.sqrt(((br[0] - bl[0]) ** 2) ((br[1] - bl[1]) ** 2))widthB np.sqrt(((tr[0] - tl[0]) ** 2) ((tr[1] - tl[1]) ** 2))maxWidth max(int(widthA), int(widthB))heightA np.sqrt(((tr[0] - br[0]) ** 2) ((tr[1] - br[1]) ** 2))heightB np.sqrt(((tl[0] - bl[0]) ** 2) ((tl[1] - bl[1]) ** 2))maxHeight max(int(heightA), int(heightB))# 变换后对应坐标位置dst np.array([[0, 0],[maxWidth - 1, 0],[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype float32)# 计算变换矩阵M cv2.getPerspectiveTransform(rect, dst)warped cv2.warpPerspective(image, M, (maxWidth, maxHeight))# 返回变换后结果return warped接收原始图像和四个顶点坐标然后应用透视变换从而获取图像的正视图。
定义图像缩放函数
def resize(image, widthNone, heightNone, intercv2.INTER_AREA):dim None(h, w) image.shape[:2]if width is None and height is None:return imageif width is None:r height / float(h)dim (int(w * r), height)else:r width / float(w)dim (width, int(h * r))resized cv2.resize(image, dim, interpolationinter)return resized
用于调整图像尺寸使图像处理过程中的操作更加高效。
主逻辑部分 图像预处理: 读取图像调整大小并转换为灰度图。应用高斯模糊和Canny边缘检测准备图像进行轮廓检测。 轮廓检测: 使用cv2.findContours寻找边缘这是寻找文档轮廓的关键步骤。选择轮廓面积最大的前五个轮廓。 透视变换: 对检测到的轮廓如果准确地检测到四点应用透视变换。将图像从斜视角转换为正视图便于文档的进一步处理和分析。 结果保存和显示: 应用二值化处理并保存变换后的扫描图像。显示原始和扫描后的图像。
关键知识点
高斯模糊 (GaussianBlur): 用于去除图像噪声并平滑图像。Canny边缘检测 (Canny): 用于在图像中检测边缘是轮廓检测的关键步骤。轮廓检测 (findContours): 在二值图像中寻找轮廓用于图形、图像和物体的形状分析。透视变换 (getPerspectiveTransform, warpPerspective): 在进行文档扫描或修正图像视角时非常有用。
if __name__ __main__:# 读取输入image cv2.imread(args[image])#坐标也会相同变化ratio image.shape[0] / 500.0orig image.copy()image resize(orig, height 500)# 预处理gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray cv2.GaussianBlur(gray, (5, 5), 0)edged cv2.Canny(gray, 75, 200)# 展示预处理结果print(STEP 1: 边缘检测)cv2.imshow(Image, image)cv2.imshow(Edged, edged)cv2.waitKey(0)cv2.destroyAllWindows()# 轮廓检测 opencv3# cnts cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[1][0]# cnts sorted(cnts, key cv2.contourArea, reverse True)[:5]# 使用OpenCV 4.x的方式来调用findContourscontours, hierarchy cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 确保轮廓是适当的数据类型cnts [np.array(cnt, dtypefloat32) for cnt in contours]# 排序并选择最大的5个轮廓cnts sorted(cnts, keycv2.contourArea, reverseTrue)[:5]# 遍历轮廓screenCnt Nonefor c in cnts:# 计算轮廓近似peri cv2.arcLength(c, True)# C表示输入的点集# epsilon表示从原始轮廓到近似轮廓的最大距离它是一个准确度参数# True表示封闭的approx cv2.approxPolyDP(c, 0.02 * peri, True)# 4个点的时候就拿出来if len(approx) 4:screenCnt approx.astype(int)breakif screenCnt is not None:# 展示结果print(STEP 2: 获取轮廓)# print(screenCnt)cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2)cv2.imshow(Outline, image)cv2.waitKey(0)cv2.destroyAllWindows()# 透视变换warped four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)# 二值处理warped cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY)ref cv2.threshold(warped, 100, 255, cv2.THRESH_BINARY)[1]cv2.imwrite(scan.jpg, ref)# 展示结果print(STEP 3: 变换)cv2.imshow(Original, resize(orig, height 650))cv2.imshow(Scanned, resize(ref, height 650))cv2.waitKey(0)Canny算子检测结果图 定 四个顶点 仿射变换结果
OCR识别
Tesseract 是一个开源的光学字符识别OCR引擎最初由惠普实验室于1985年开发并在2006年由Google赞助成为一个开源项目。Tesseract 能够识别多种格式的图像文件并将它们转换成文本。它支持多种语言的识别并且可以通过训练来识别新的语言或优化现有语言的识别效果。
主要特点
多语言支持Tesseract 支持100多种语言的识别。高度可定制用户可以训练Tesseract来识别新的字体或优化特定语言的识别。多种输出格式Tesseract 可以输出普通文本、hOCR带有布局信息的HTML、PDF等格式。集成易用可以通过命令行使用也可通过其API集成到其他应用程序中比如通过pytesseract在Python中使用。
使用方法
在命令行中Tesseract 可以简单地通过指定输入图像和输出文件名来使用如
tesseract image.png output -l eng这里-l eng指定了使用英语语言包。
pytesseract
在Python中pytesseract是一个将Tesseract引擎功能封装的库允许Python直接调用Tesseract进行图像到文本的转换。使用前需要确保Tesseract已安装在系统上并且正确配置了环境变量或在pytesseract的tesseract_cmd属性中指定了Tesseract的路径。
应用场景
文档数字化将纸质文档扫描后识别为数字文本。自动化表单处理从填写的表单中提取信息。车牌识别用于交通监控或自动收费系统。辅助技术帮助视觉障碍人士阅读印刷材料。
Tesseract是一个功能强大的工具因其开源和高效被广泛用于商业和研究领域。
1. 导入必要的库
PIL (Python Imaging Library): 用于图像的打开和处理。pytesseract: 是Google的Tesseract-OCR引擎的Python封装用于识别图像中的文字。cv2 (OpenCV): 用于图像处理的库这里用于读取和预处理图像。
from PIL import Image
import pytesseract
import cv2
import os2. 图像预处理
读取图像: 使用cv2.imread读取图像文件。转换为灰度图: 使用cv2.cvtColor将读取的彩色图像转换为灰度图因为OCR通常在灰度图上进行。应用阈值或模糊处理: 如果预处理方式为thresh阈值使用cv2.threshold应用阈值化处理这可以帮助去除背景噪声并突出文本。如果预处理方式为blur模糊使用cv2.medianBlur应用中值模糊以减少图像噪声。
preprocess blur #threshimage cv2.imread(scan.jpg)
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)if preprocess thresh:gray cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]if preprocess blur:gray cv2.medianBlur(gray, 3)
3. 保存处理后的图像
保存文件: 使用cv2.imwrite将处理后的灰度图像临时保存为一个新文件文件名由当前进程ID命名。
4. 文本识别
使用pytesseract.image_to_string函数读取步骤3中保存的灰度图像文件识别其中的文本。
filename {}.png.format(os.getpid())
cv2.imwrite(filename, gray)text pytesseract.image_to_string(Image.open(filename))
print(text)
os.remove(filename)cv2.imshow(Image, image)
cv2.imshow(Output, gray)
cv2.waitKey(0) 5. 输出和清理
打印识别的文本。删除临时文件: 使用os.remove删除保存的临时图像文件。显示图像: 使用cv2.imshow展示原始图像和处理后的图像。等待按键: 使用cv2.waitKey(0)暂停程序等待用户按键继续。
知识点总结
OpenCV的灰度转换和图像滤波灰度转换有助于简化数据滤波有助于减少噪声这两者都是提高OCR准确性的关键步骤。阈值处理与模糊处理的选择不同的图像预处理方法适用于不同类型的图像和需求阈值处理适用于高对比度图像而模糊处理适用于噪声较多的图像。pytesseract的使用封装了Tesseract-OCR引擎能够从图像中识别和提取文字。
通过仿射变换矫正后图像为 识别结果为
源码上传地址
链接 ----------------上传地址 文档OCR识别tesseract