文本区域提取和分析——Python版本

目录

1. 图像预处理

2. 文本区域提取

3. 文本行分割

4. 文本区域分析

5. 应用举例

总结


文本区域提取和分析是计算机视觉中的重要任务,尤其在光学字符识别(OCR)系统、文档分析、自动化数据录入等应用中有广泛的应用。其目标是从图像中提取出包含文本的区域,去除噪声,准确地识别和定位文本。该过程通常分为几个主要步骤:图像预处理、文本区域提取、文本行分割、文本区域分析等。


1. 图像预处理

在文本区域提取之前,图像通常需要进行一些预处理,以提高后续处理的准确性。预处理的目标是去除噪声、增强文本对比度,确保图像中的文本区域能够清晰地被提取。

常见预处理方法

  • 灰度化:将彩色图像转为灰度图像,减少计算复杂度。

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    

  • 二值化(Thresholding):将图像转换为黑白二值图,突出显示前景(文本)与背景的对比。常用方法有:

    • 全局阈值:设定一个固定的阈值,将高于阈值的像素设为白色(前景),低于阈值的设为黑色(背景)。
    • Otsu的阈值法:自动计算最佳阈值进行二值化,适用于背景和前景的灰度分布差异较大的情况。
    _, binary_image = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  • 去噪声:使用滤波器去除图像中的噪声,常用的方法有中值滤波、高斯滤波等。

    blurred = cv2.GaussianBlur(binary_image, (5, 5), 0)
    

2. 文本区域提取

文本区域提取的目标是从二值化图像中识别出包含文本的区域。常见的文本区域提取方法包括连通区域分析、轮廓检测等。

连通区域分析(Connected Component Analysis)

连通区域分析用于在二值图像中找出相邻的像素区域,这些区域通常是文本区域或噪声。每个连通区域可以通过标签进行标记。

  • 步骤
    1. 标记图像中的连通区域:识别图像中所有前景区域,给每个区域一个唯一的标签。
    2. 提取区域属性:可以提取每个区域的面积、边界框、质心等信息,帮助筛选出可能的文本区域。
num_labels, labeled_image = cv2.connectedComponents(binary_image)
  • 区域大小筛选:根据区域的面积(或其他属性)来过滤掉噪声和不相关的区域。文本区域通常有一定的面积范围,过小的区域可能是噪声,过大的区域可能是背景。

轮廓检测(Contour Detection)

轮廓检测通过查找图像中的边缘来提取区域。它是基于边缘的检测方法,通常用于提取形状较明显的文本区域。

  • 步骤
    1. 查找轮廓:使用 cv2.findContours() 函数检测图像中的轮廓。
    2. 过滤和选择感兴趣的轮廓:可以根据轮廓的面积、形状等特征,选择那些可能是文本的区域。
contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  • 提取文本区域:根据检测到的轮廓信息,提取每个可能包含文本的矩形区域。

3. 文本行分割

文本行分割是文本区域提取后进一步细化的步骤,目的是将多行文本分开,使得每一行能够单独处理。

水平投影分析(Horizontal Projection Analysis)

通过计算图像中每一行像素的“白色像素”和(或者“非零像素”)的数量,来识别文本行和行间的空隙。

  • 步骤
    1. 计算每行的投影值:统计每一行的白色像素总数。
    2. 识别行间间隙:通过设定一个阈值,识别像素和小于该值的行,认为它们是文本行之间的空白区域。
row_sums = np.sum(binary_image > 0, axis=1)
  • 文本行提取:通过识别投影中的空隙,可以将图像划分为多行文本。
垂直投影分析(Vertical Projection Analysis)

类似于水平投影,通过统计每列的白色像素数量来识别单个字符或文本块。垂直投影在字符分割中尤为重要。


4. 文本区域分析

文本区域分析是在提取出文本区域后,进一步对这些区域进行细致分析,以便进行后续的OCR或其他任务。

区域属性提取

通过 skimage.measure.regionprops 函数或 OpenCV 的轮廓属性分析,提取文本区域的属性:

  • 边界框(Bounding Box):为每个区域计算一个最小的矩形框,通常用 (y_min, x_min, y_max, x_max) 四个坐标表示。
  • 面积(Area):区域的像素数量。
  • 质心(Centroid):区域的几何中心位置。
  • 长宽比(Aspect Ratio):区域宽度与高度的比值,通常用于判断文本区域的形状。
from skimage.measure import regionprops

regions = regionprops(labeled_image)
bounding_box = regions[0].bbox  # 获取边界框
area = regions[0].area  # 获取面积
centroid = regions[0].centroid  # 获取质心
文本区域排序

如果图像中有多行文本,可以根据边界框的位置对区域进行排序。例如,按 y_min 对区域进行排序,确保文本行按照从上到下的顺序排列。


5. 应用举例

  1. 文档扫描与分析:在文档扫描和自动化数据录入系统中,文本区域提取与行分割是关键步骤。首先提取出文档中的文字区域,然后根据投影分析将文字分为行,最后进行OCR识别。
  2. 车牌识别:在车牌识别中,通常需要通过区域提取和文本行分割来定位车牌的文字部分。
  3. 自动化表格分析:在表格分析中,通过检测和分析文本区域,可以识别表格的行列,并进行数据提取。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.measure import label, regionprops

# 读取灰度图像
image_path = '02.jpg'  # 图像文件路径
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)  # 使用OpenCV读取图像为灰度图

# 使用Otsu的阈值法将图像二值化
_, BW = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)  # 自动计算阈值并将图像转换为二值图

# 查找连通区域(标记图中的区域)
num_labels, labeled_image = cv2.connectedComponents(BW)  # 使用OpenCV标记连通组件
region_sizes = [(labeled_image == i).sum() for i in range(1, num_labels)]  # 计算每个区域的像素数量
max_region_index = np.argmax(region_sizes) + 1  # 找到最大区域的索引(组件标签从1开始)

# (a) 显示图像中最大白色区域
mask = (labeled_image == max_region_index).astype(np.uint8)  # 提取最大区域的掩码
plt.figure(figsize=(5, 5))
plt.imshow(mask, cmap='gray')  # 显示最大区域的二值掩码
plt.title("Largest White Region (a)")  # 设置标题
plt.axis('off')  # 关闭坐标轴

# (b) 提取最大区域的边界框(ROI区域,包含文本)
props = regionprops(mask)  # 获取连通区域的属性,包括边界框
bounding_box = props[0].bbox  # 获取最大区域的边界框(最小行,最小列,最大行,最大列)
y_min, x_min, y_max, x_max = bounding_box  # 解包边界框坐标
ROI = BW[y_min:y_max, x_min:x_max]  # 提取包含文本的感兴趣区域(ROI)
ROI = cv2.bitwise_not(ROI)  # 反转颜色:背景变黑,字符变白
plt.figure(figsize=(5, 5))
plt.imshow(ROI, cmap='gray')  # 显示提取的文本区域
plt.title("Text Region (b)")  # 设置标题
plt.axis('off')  # 关闭坐标轴

# 计算水平投影(每行白色像素的和)
row_sums = np.sum(ROI > 0, axis=1)  # 对每一行的白色像素求和

# (c) 可视化水平投影(每行白色像素的和)
plt.figure(figsize=(5, 5))
plt.plot(row_sums)  # 绘制每行像素和的曲线
plt.title("Row Projection (c)")  # 设置标题
plt.xlabel('Row Index')  # 设置X轴标签
plt.ylabel('Sum of Pixels')  # 设置Y轴标签

# 识别有间隙的行(即行与行之间的空隙,可能是文本行之间的空白区域)
threshold = 5  # 设定一个阈值,用于识别文本行之间的间隙(可根据实际情况调整)
regions = []  # 存储有间隙的区域
in_region = False  # 标记是否正在检测某一行的文本区域
start_index = 0  # 记录当前区域的起始索引

# 根据水平投影值识别行之间的间隙
for i, value in enumerate(row_sums):
    if value < threshold and not in_region:  # 如果当前行的像素和小于阈值且尚未进入文本区域
        start_index = i  # 记录区域的开始行
        in_region = True  # 进入文本区域
    elif value >= threshold and in_region:  # 如果当前行的像素和大于阈值且正在检测文本区域
        end_index = i - 1  # 记录区域的结束行
        regions.append((start_index, end_index))  # 将区域保存到regions列表
        in_region = False  # 退出文本区域

# 如果最后仍处于区域内,添加最后一个区域
if in_region:
    regions.append((start_index, len(row_sums) - 1))

# 提取每一行并显示
for i in range(len(regions) - 1):
    row_start = regions[i][1]  # 获取当前行的开始行索引
    row_end = regions[i + 1][0]  # 获取下一行的开始行索引(即当前行结束位置)
    row_image = ROI[row_start:row_end, :]  # 提取当前行的图像
    
    plt.figure()
    plt.title(f"Row {i + 1}")  # 设置标题,显示行号
    plt.imshow(row_image, cmap='gray')  # 显示当前行
    plt.axis('off')  # 关闭坐标轴
    plt.show()


总结

文本区域提取与分析包括:

  1. 图像预处理:通过灰度化、二值化和去噪声等手段,清晰地显示文本区域。
  2. 文本区域提取:使用连通区域分析或轮廓检测方法提取文本区域。
  3. 文本行分割:利用投影分析将图像划分为不同的文本行。
  4. 区域属性分析:提取文本区域的边界框、面积、质心等属性,以便后续的OCR或文本识别。

这些技术广泛应用于光学字符识别(OCR)、文档分析、车牌识别等多个领域。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/947698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为的数字化转型框架和数字化转型成熟度评估方法

2016年&#xff0c;华为公司数字化转型变革规划汇报通过&#xff0c;一系列的变革项目由变革指导委员会(Executive Steering Committee,ESC)完成立项。8年多来&#xff0c;华为数字化转型工作初步取得了一些成果&#xff0c;比如&#xff1a; 实现“销售收入翻番&#xff0c;但…

算法 Class 006(二分搜索)

一、查找一个数 在一个有序数组中查找数字&#xff0c;每次一循环可 砍掉一半的值&#xff0c;只要确定了 arr[mid] 与 num 之间的关系。 大于num 忽略掉 mid及右边的数字 小于 num 忽略掉 mid 及左边的数字 二、 找大于等于 num 的最左位置 意思就是该下标及右边的数都是大于…

【工具整理】WIN换MAC机器使用工具整理

最近公司电脑升级&#xff0c;研发同学统一更换了 Mac Book Pro 笔记版电脑&#xff0c;整理一下安装了那些软件以及出处&#xff0c;分享记录下&#xff5e; 知识库工具 1、语雀 网址&#xff1a;语雀&#xff0c;为每一个人提供优秀的文档和知识库工具 语雀 个人花园&…

EdgeX规则引擎eKuiper

EdgeX 规则引擎eKuiper 一、架构设计 LF Edge eKuiper 是物联网数据分析和流式计算引擎。它是一个通用的边缘计算服务或中间件,为资源有限的边缘网关或设备而设计。 eKuiper 采用 Go 语言编写,其架构如下图所示: eKuiper 是 Golang 实现的轻量级物联网边缘分析、流式处理开源…

Python脚本实现通过Vector VN1630A CAN盒子与ECU通信

1 安装 python-can 包 安装命令如下&#xff1a; pip install python-can安装完成后可用下面命令查看是否安装成功及版本。 pip show python-canName: python-can Version: 4.4.2 Summary: Controller Area Network interface module for Python Home-page: https://github.…

职场常用Excel基础04-二维表转换

大家好&#xff0c;今天和大家一起分享一下excel的二维表转换相关内容~ 在Excel中&#xff0c;二维表&#xff08;也称为矩阵或表格&#xff09;是一种组织数据的方式&#xff0c;其中数据按照行和列的格式进行排列。然而&#xff0c;在实际的数据分析过程中&#xff0c;我们常…

编程利器豆包MarsCode它来了

你在使用vsCode进行编写代码时是否遇到代码错误不知道如何修改&#xff1f;是否遇到代码复杂不知道逻辑业务&#xff1f;是否遇到只有思路不知道如何写出代码的情况&#xff1f; 现在&#xff0c;一款代码助手神器它来了&#xff0c;有了它&#xff0c;上面的问题和烦恼统统秒…

idea( 2022.3.2)打包报错总结

一 报错 class lombok.javac.apt.LombokProcessor (in unnamed module 0x4fe64d23) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing …

戴尔/Dell 电脑按什么快捷键可以进入 Bios 设置界面?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机硬件与操作系统之间的桥梁&#xff0c;它负责初始化和测试系统硬件组件&#xff0c;并加载启动操作系统。在某些情况下&#xff0c;如调整启动顺序、更改系统时间或日期、修改硬件配置等&#xff0c;您可能需要进入BIOS进…

小程序组件 —— 25 组件案例 - 商品导航区域

这一节主要实现商品导航区的结构和样式&#xff0c;商品导航区没有新的知识点&#xff0c;主要使用之前学习的三个组件&#xff1a; view&#xff1a;视图容器iamge&#xff1a;图片组件text&#xff1a;文本组件 商品导航区由五个商品导航来组成&#xff0c;每一个视频导航都…

数据结构(ing)

学习内容 指针 指针的定义&#xff1a; 指针是一种变量&#xff0c;它的值为另一个变量的地址&#xff0c;即内存地址。 指针在内存中也是要占据位置的。 指针类型&#xff1a; 指针的值用来存储内存地址&#xff0c;指针的类型表示该地址所指向的数据类型并告诉编译器如何解…

Vue 中el-table-column 进行循环,页面没渲染成功

文章目录 前言效果图代码示例可能出现的问题及原因解决思路 前言 实现效果&#xff1a;el-table-column 进行循环&#xff0c;使之代码简化 遇到的问题&#xff1a; data进行默认赋值&#xff0c;操作列的删除都可以出来&#xff0c;其他表格里面的数据没出来 效果图 示例&am…

OpenGL入门最后一章观察矩阵(照相机)

前面的一篇文章笔者向大家介绍了模型变化矩阵&#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中&#xff0c;我们看到了即使没有观察矩阵&#xff0c;我们也能对绘制出来的模型有一…

教程:从pycharm基于anaconda构建机器学习环境并运行第一个 Python 文件

1. 安装 PyCharm 访问 PyCharm 官方网站&#xff1a;https://www.jetbrains.com/pycharm/。下载社区版&#xff08;免费&#xff09;或专业版&#xff08;收费&#xff0c;提供更多功能&#xff09;。按照操作系统的安装指导安装 PyCharm。安装后打开 PyCharm&#xff0c;并根…

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…

ceph文件系统

ceph文件系统&#xff1a;高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提高性能&#xff0c;高可靠性和高可用的对 象存储&#xff0c;块存储&#xff0c;文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON&#xff1a;ceph m…

牛客网刷题 ——C语言初阶——BC117 小乐乐走台阶

1.题目 &#xff1a;BC117 小乐乐走台阶 牛客OJ题链接 描述 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述&#xff1a; 输入包含一个整数n (1 ≤ n ≤ 30) …

flux文生图 生成高质量图像

flux文生图 生成高质量图像 flyfish import torch from diffusers import FluxPipeline# 初始化 FluxPipeline model_path "/home/FLUX___1-dev" pipe FluxPipeline.from_pretrained(model_path, torch_dtypetorch.bfloat16) pipe.enable_model_cpu_offload() #…

设计模式 结构型 装饰器模式(Decorator Pattern)与 常见技术框架应用 解析

装饰器模式&#xff08;Decorator Pattern&#xff09;&#xff0c;又称为包装器模式&#xff08;Wrapper Pattern&#xff09;&#xff0c;是一种结构型设计模式。它允许在不改变原有对象结构的基础上&#xff0c;动态地给对象添加一些新的职责&#xff08;即增加其额外功能&a…

计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫

2021年12月21日 姓名 专业 软件工程 班级 20-IBM-企Java2 题目 基于hadoopSpark的游戏推荐与可视化系统的设计与实现 指导教师 王文钧、王春娴 一、与本题目有关的国内外研究情况、题目研究的目的和意义、主要内容、本课题创新之处、拟解决的问题&#xff1a; 国内外…