PaddleOCR 图片文字提取

server/2024/9/25 8:44:55/

PaddleOCR 图片文字提取

  • 需求
  • 一.裁剪车牌号码区域
  • 二.对车牌小图进行处理
  • 三.填充边界
  • 四.识别步骤


需求

   工作上的一个需求,需要把图片中的车牌号码提取出来。如图,车牌在图片固定位置。开始使用pytesseract,对中文识别特别不友好,毕竟是外国人的东西。同事推荐使用PaddleOCR,国人开发的东西就是不一样,识别正确率居然可以达到90%以上。不过两者都存在共性问题,黑底白字无法识别/范围太小识别不准等。
在这里插入图片描述


一.裁剪车牌号码区域

# np.fromfil 从文本或二进制文件中的数据构造一个数组
# cv2.imdecode()把读取的数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像
# cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,可以直接写-1
img = cv2.imdecode(np.fromfile(imgSrc, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
cropImg = img[y1:y2, x1:x2] #顺序为上下 左右
(车牌裁剪出来的小图)

在这里插入图片描述

正常来说把上面裁剪出来的小图进行OCR,就可以识别出文字了,结果....

在这里插入图片描述
   于是百度找了张图,刚好是白底黑字 文字居中,结果神奇地识别结果100%识别正确。经过对比,我断定是白色字体无法识别,接着又把小图进行反相处理。

二.对车牌小图进行处理

height, width, deep = cropImg.shapegray = cv2.cvtColor(cropImg, cv2.COLOR_BGR2GRAY) # cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片dst = np.zeros((height, width, 1), np.uint8) #生成一张纯黑色图for i in range(0, height):  # 反相 转白底黑字for j in range(0, width):grayPixel = gray[i, j]dst[i, j] = 255 - grayPixel#走完这一步,已经实现了 转白底黑字,但是白色低背景不是最亮的#再用cv2.threshold进行二值化,使黑色部分更黑,白的更白
ret, img = cv2.threshold(dst, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

   对小图进行反相处理后的结果就是下面这样,仔细看发现白色底不是很白,再用cv.threshold进行二值化(非黑既白),通对比二值化的图片,层次感就出来了。

(反相后)

在这里插入图片描述

(二值化后)

在这里插入图片描述
   再次进行识别,识别结果终于出来了,但是发现最后一位7被识别成了2,按道理来说这么简单的文字不应该识别错。于是想到前面用来测试识别的图片边界很宽,文字居中,接着对小图进行了填充白底边界150个像素。

三.填充边界

# cv2.BORDER_CONSTANT 固定值填充方式
imgsrc = cv2.copyMakeBorder(img, 150, 150, 150, 150, cv2.BORDER_CONSTANT, value=[255, 255, 255])
(填充后)

在这里插入图片描述


四.识别步骤

ocr = PaddleOCR(use_angle_cls=True, use_gpu=False)  # 使用CPU预加载,不用GPU
text = ocr.ocr(img, cls=True)
result = str(text[0][1][0]).replace('车牌号码:', '').upper()
(最终识别效果)

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/server/101587.html

相关文章

MySQL——单表查询(一)简单查询(1)SELECT语句

MySQL 从数据表中查询数据的基本语句是SELECT 语句。在 SELECT 语句中,可以根据自己对数据的需求,使用不同的查询条件,SELECT语句的基本语法格式如下: SELECT [DISTINCT] * | 字段名 1,字段名 2,字段名 3,…FROM 表名[WHERE 条件表达式 1][G…

贷齐乐案例

源码分析&#xff1a; <?php // 设置 HTTP 头部&#xff0c;指定内容类型为 text/html&#xff0c;字符集为 utf-8 header("Content-type: text/html; charsetutf-8"); // 引入数据库配置文件 require db.inc.php; // 定义函数 dhtmlspecialchars&#xff0c;用…

C:数组传参的本质

1、一维数组传参的本质 数组传参是指在函数调用时将数组作为参数传递给函数。 int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };test(arr);return 0;}数组传参只需要写数组名就可以了。注意&#xff1a;数组名是arr&#xff0c;而不是arr[10] 数组传参形参该怎么写呢&am…

网络效能精进:从根源剖析到策略实施

网络效能精进&#xff1a;从根源剖析到策略实施 在当今数字化时代&#xff0c;网络性能直接关系到企业运营的流畅度与用户体验的质量。本文旨在深入探讨网络性能优化的全过程&#xff0c;从问题诊断的细致入微到解决方案的精准实施&#xff0c;为企业网络效能的提升提供一套系…

【ubuntu24.04】docker安装

安装docker sudo apt install apt-transport-https curlsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin安装的组件包括:docker-ce:Docker Engine。 docker-ce-cli:用于与 Docker 守护进程通信的命令行工具。 containe…

24/8/17算法笔记 模仿学习算法

模仿学习&#xff08;Imitation Learning&#xff0c;IL&#xff09;算法是强化学习领域的一个分支&#xff0c;它关注于让智能体通过模仿专家的行为来学习任务。模仿学习通常用于学习复杂任务&#xff0c;尤其是当通过传统的强化学习算法直接学习效率较低或成本较高时。以下是…

vim中跳转头文件

在 Vim 中&#xff0c;你可以通过以下几种方式跳转到系统头文件的定义&#xff1a; 1. 使用 gf 命令 在 Vim 中&#xff0c;将光标移动到头文件的名称上&#xff08;例如 #include <iostream>&#xff09;。按 gf&#xff08;goto file&#xff09;&#xff0c;Vim 会尝…

B站搜索建库架构优化实践

前言 搜索是B站的重要基础功能&#xff0c;需要对包括视频、评论、图文等海量的站内优质资源建立索引&#xff0c;处理来自用户每日数亿的检索请求。离线索引数据的正确、高效产出是搜索业务的基础。我们在这里分享搜索离线架构整体的改造实践&#xff1a;从周期长&#xff0c;…