【第二十六周】OCR学习01

文章目录

  • 摘要
  • Abstract
  • 一、图像预处理
    • [1. 图像滤波](#1. 图像滤波)
      • [1.1 高斯模糊:](#1.1 高斯模糊:)
      • [1.2 中值模糊:](#1.2 中值模糊:)
      • [1.3 拉普拉斯滤波器:](#1.3 拉普拉斯滤波器:)
      • [1.4 双边滤波器:](#1.4 双边滤波器:)
    • [2. 使用分割技术检测和移除背景](#2. 使用分割技术检测和移除背景)
    • [3. 数据集增强](#3. 数据集增强)
    • [4. 像素值调整](#4. 像素值调整)
  • 二、案例:图片文字提取器
    • [1. 原始版本](#1. 原始版本)
      • [1.1 代码解读](#1.1 代码解读)
    • [2. 进一步探究](#2. 进一步探究)
  • 总结

摘要

本周围绕图像预处理与 OCR 文字提取展开,系统学习了图像滤波(高斯、中值、拉普拉斯、双边滤波)、背景分割(阈值化、边缘检测等)、数据集增强(翻转 / 旋转、裁剪等)、像素值调整(二值化、灰度化、归一化)四类核心图像预处理技术的原理与应用场景。

同时,以 EasyOCR 为工具搭建图片文字提取器,展示了从图像读取、灰度化 / 高斯滤波降噪到文本识别的完整流程,还进一步探究了裁剪、旋转等图像调整对识别精度的影响,并实现了为识别文本添加检测边框的可视化功能。


Abstract

This week, my learning focused on image preprocessing and OCR text extraction. I systematically studied the principles and application scenarios of four core image preprocessing techniques:image filtering (Gaussian filtering, median filtering, Laplacian filtering, bilateral filtering);background segmentation (thresholding, edge detection, etc.);dataset augmentation (flipping/rotation, cropping, etc.);pixel value adjustment (binarization, grayscale conversion, normalization).

Meanwhile, I built an image text extractor using EasyOCR as the tool, demonstrating the complete process from image reading, grayscale conversion/Gaussian filtering for denoising, to text recognition. Furthermore, I explored the impact of image adjustments (such as cropping and rotation) on recognition accuracy, and implemented a visualization function to add detection bounding boxes to the recognized text.


一、图像预处理

参考文章列表:

1,【原文链接:https://blog.csdn.net/matt45m/article/details/137092314】

2,【原文链接:https://blog.csdn.net/2302_80961196/article/details/153827359】

1. 图像滤波

图像滤波的作用是平滑图像、去除噪声、增强图像等。滤波操作可以通过应用各种类型的滤波器来实现,其中包括线性滤波器(如均值滤波、高斯滤波)和非线性滤波器(如中值滤波)等。

1.1 高斯模糊:

高斯模糊过滤器减少图像中的细节和噪声。它通过对每个像素及其周围像素应用高斯函数来"模糊"图像。这可以帮助平滑边缘和细节,为边缘检测或其他处理技术做准备。

实验证明:高斯核越大,模糊的范围越大。因此核大小合适时,会有磨皮效果,过大则会非常模糊,过小则边界明显。

效果如下:

1.2 中值模糊:

中值模糊过滤器适用于从图像中去除盐和胡椒噪声。它的工作原理是用邻近像素的中值替换每个像素。这可以帮助平滑孤立的噪声像素,同时保留边缘。

高斯滤波和中值滤波的区别:

高斯滤波:处理细小,均匀的噪点。将噪点与原图中像素点进行处理取加权平均值,最后使得噪点融入图片,虽然原图细节没有了,但是噪点并不突兀了,像加了磨皮滤镜。

中值滤波:处理图片中很显眼的"污点", 用"中位数"取代"平均值"。

1.3 拉普拉斯滤波器:

拉普拉斯滤波器用于检测图像中的边缘。它通过检测强度变化迅速的区域来工作。输出将是一个突出显示边缘的图像,然后可以用于边缘检测。这有助于识别和提取图像中的特征。

1.4 双边滤波器:

双边滤波器在保留边缘的同时平滑图像。它通过考虑像素的空间接近度和颜色相似性来实现这一点。空间上靠近且颜色相似的像素将一起平滑。空间上远离或颜色差异很大的像素不会被平滑。这导致了一个具有锋利边缘的平滑图像。双边滤波器在边缘检测之前的噪声减少中可能有用。

2. 使用分割技术检测和移除背景

检测和移除图像的背景是许多计算机视觉任务中的重要预处理步骤。分割可以将前景主题与背景分离,得到只包含主题的清晰图像。

原图:

常见图像分割方法:
阈值化(Thresholding) :阈值化是将图像转换为二值图像的方法。通过选择一个阈值,像素值高于阈值的被标记为前景,低于阈值的被标记为背景。你可以使用OpenCV的cv2.threshold()函数应用阈值化。

阈值化效果如下:

边缘检测(Edge Detection) :边缘检测可以找到图像中的边缘,即对象之间的边界。Canny边缘检测是一种流行的算法,你可以使用OpenCV的cv2.Canny()函数来实现。

区域生长(Region Growing):区域生长是一种从种子点开始,逐步将相邻像素添加到区域中的方法。你可以使用scikit-image的skimage.segmentation.region_growing()函数来实现。

分水岭算法(Watershed Algorithm):分水岭算法将图像视为地形图,通过模拟水流的流动来分割图像。你可以使用scikit-image的skimage.segmentation.watershed()函数来实现。

3. 数据集增强

数据增强是一种通过生成新的图像来人为扩展数据集大小的技术,有助于减少过拟合并提高模型的泛化能力。常见的图像数据增强包括:

**翻转和旋转:**对图像进行水平或垂直翻转,以及90度、180度、270度的旋转,可以生成新的数据点。这样做可以使模型更好地适应不同的视角和方向。

裁剪:将图像裁剪到不同的大小和比例,可以创建具有不同视野的新图像。随机裁剪和特定比例的裁剪都是常见的方法。

**颜色调整:**调整图像的亮度、对比度、色调和饱和度可以创建具有不同外观的图像。但要小心,不要使图像过度扭曲,以免模型混淆。

**图像叠加:**在图像上叠加透明图像、纹理或噪声可以创建原始数据的变化。例如,添加水印、标志、污垢或高斯噪声等。

**结合技术:**结合多种增强技术可以进一步扩展数据集。例如,结合翻转、旋转、裁剪和颜色调整,可以生成更多样化的图像。

4. 像素值调整

像素值调整类:优化图像基础属性

  1. 二值化
    将图像转换为仅含黑白两种颜色的二值图像(像素值 0 或 255),通过设定阈值区分前景(如文字、目标)和背景。
    应用场景:文字识别、条形码提取、轮廓分割(消除灰度渐变干扰)。
  2. 灰度化
  3. 归一化
    作用:避免因像素值范围不一致导致模型收敛困难(如神经网络输入需标准化)。

二、案例:图片文字提取器

1. 原始版本

powershell 复制代码
import easyocr
import cv2

# 1. 初始化OCR阅读器(指定语言:中文+英文,启用GPU加速)
reader = easyocr.Reader(['ch_sim', 'en'], gpu=True)  # 若没有GPU,设为gpu=False

# 2. 读取图片并预处理(关键步骤:降噪、增强对比度)
img = cv2.imread('D:\Program\DeepseekOCR-learning\Period1-PicPreprocess\Pic\paipai.jpg')  # 读取图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转为灰度图(减少色彩干扰)
# 输入的灰度图像(单通道),高斯滤波(去除噪声),确定卷积核大小,以及方向
# 0:x 方向和 y 方向的标准差σ。OpenCV 会自动根据核大小计算
blur = cv2.GaussianBlur(gray, (3, 3), 0)

# 3. 调用OCR识别
result = reader.readtext(blur, detail=1)  # detail=1返回详细信息(坐标、置信度)

# 4. 提取纯文本并打印
text = [item[1] for item in result]
print("识别结果:", '\n'.join(text))

1.1 代码解读

1,reader.readtext() 内部执行流程:

(1)图像预处理:自动对输入图像(此处为 blur 去噪后的灰度图)进行二次优化

(2)文本检测(Text Detection):使用预训练的文本检测模型,在图像中定位所有可能的文本区域,输出每个文本框的坐标。

(3)文本识别(Text Recognition):对每个检测到的文本框,裁剪出对应的图像区域;将裁剪后的区域输入预训练的文本识别模型,识别出文本内容。

注:计算识别结果的置信度(0-1 之间,越接近 1 越可靠)。

(4)结果格式化:根据 detail 参数,将检测和识别结果格式化为不同结构:

detail=0:仅返回纯文本列表([text1, text2, ...]);

detail=1:返回包含坐标、文本、置信度的详细信息列表(默认值)。

2,text = [item[1] for item in result]

代码为:列表推导式,从 result 列表中提取每个文本区域的识别结果(即 item[1]),最终生成一个纯文本列表。

执行逻辑:遍历 result 中的每个元素 item,取出 item[1](文本内容),将所有文本拼接成新列表 text。

3,'\n'.join(text)

"/n"可以换成其他字符,按需求进行使用

2. 进一步探究

对图片进行调整,判别影响

根据平均识别精确度来判别结果是否有被优化。

(1)观察两种精确度的计算方式

(2)下图分别是原图,裁剪后,旋转后的文本识别精确度

添加文本框

powershell 复制代码
# fix_ocr.py
import os
import sys

from nltk import accuracy

# 在导入任何可能使用OpenMP的库之前设置这些
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
os.environ['OMP_NUM_THREADS'] = '1'
os.environ['MKL_NUM_THREADS'] = '1'

import cv2
import easyocr
import matplotlib.pyplot as plt
import numpy as np

# 1. 设置中文字体(关键步骤)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']  # 指定字体
plt.rcParams['axes.unicode_minus'] = False  # 正确显示负号

#1,initial OCR reading machine and choose language needing to recognize,
reader = easyocr.Reader(['en','ch_sim'], gpu=True)

#2,read img
img = cv2.imread('./Pic/paipai.jpg')
img_cut = cv2.imread('./Pic/paipai_cut.jpg')
img_rotation = cv2.imread('Pic/paipai_spin.jpg')

#3,process the img
#convert the img to a grayscale img
gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#remove noise by GaussianBlur
blur = cv2.GaussianBlur(gary, (3,3), 0)

#change original img to RGB and show
img_RGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(15,10))
plt.imshow(img_RGB)

#4,change img to text
#reprocess the pic for augmentation and extract information from it
result = reader.readtext(blur)
accuracy = 0
for i,item in enumerate(result):
    coords = item[0]
    print(f"文本位置{i + 1}:{item[0]}")
    print(f"文本内容:{item[1]}")
    points = np.array(coords,dtype=np.int32)
    for j in range(4):
        x1,y1 = points[j]
        x2,y2 = points[(j+1)%4]

        plt.scatter(x1,y1,s=30,c='red')

        plt.plot([x1,x2], [y1,y2], color='red',linewidth=2,linestyle='--')
plt.title('OCR文本检测边框(基础版)')
plt.axis('off')
plt.tight_layout()
plt.show()

1,enumerate 不是元组,而是一个内置函数,它返回一个枚举对象(迭代器)。

返回对象索引和内容

enumerate返回的是元组序列


总结

图像预处理是 OCR 的关键前提:不同滤波方式适配不同噪声类型,背景分割、像素调整等操作可减少干扰,提升文本区域的辨识度;数据集增强则能助力 OCR 模型泛化能力提升。

EasyOCR 文字提取核心步骤为「图像读取→灰度化 / 滤波降噪→文本检测(定位文本框)→文本识别→结果格式化」,可通过参数控制返回纯文本或含坐标、置信度的详细信息,满足不同使用需求。

相关推荐
charlie1145141912 小时前
现代C++工程实践:简单的IniParser4——实现ini_parser
开发语言·c++·笔记·学习·工程
好奇龙猫2 小时前
【AI学习-comfyUI学习-第十五节-FLUX修复工作流-各个部分学习】
学习
天`南3 小时前
【群智能算法改进】一种改进的金豺优化算法IGJO[1](动态折射反向学习、黄金正弦策略、自适应能量因子)【Matlab代码#94】
学习·算法·matlab
长桥夜波3 小时前
【第二十三周】统计学习复习笔记
笔记·学习
pandarking3 小时前
[CTF]攻防世界:easy_laravel 学习
java·学习·web安全·laravel·ctf
AA陈超3 小时前
LyraStarterGame 5.6 项目学习路径
c++·笔记·学习·lyra
其美杰布-富贵-李3 小时前
Fluent 网格质量全面评估(完整学习笔记)
笔记·学习·cfd·fluent·网格质量
YJlio4 小时前
桌面工具学习笔记(11.3):ZoomIt——演示、录屏与线上会议的放大标注神器
笔记·学习·安全
代码游侠4 小时前
复习——Linux 系统编程
linux·运维·c语言·学习·算法