计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正

概述

在计算机视觉领域,处理文档数据时,OCR算法的性能往往会受到文档的倾斜度影响。如果文档在输入到模型之前没有经过恰当的校正,模型就无法期待模型能够提供准确的预测结果,或者模型预测的精度会降低。例如,在信息提取系统中,如果向OCR模型提供了倾斜的图像,模型可能无法准确地识别出文本内容的同时,文本的对齐方式也可能因此而丢失。特别在一些包含了表格检测文档,如果在进行表格检测之前没有对图像的倾斜度进行校正,那么模型可能无法准确地预测出表格的边界和角落。

文档的倾斜度是指在扫描或数字化捕获过程中,文档图像出现的倾斜或斜度。这种情况通常因为图像获取时的环境或者设备的原因。在文档处理系统中,进行倾斜估计是一项至关重要的工作,尤其对于扫描得到的文档图像而言,因为准确的倾斜估计直接影响到后续处理步骤的效果。
在这里插入图片描述

文档倾斜校正

主要的方法是通过在2D离散傅里叶幅度谱上应用自适应径向投影来提取给定文档图像的主要倾斜角度。这一过程首先通过二维离散傅里叶变换(DFT)将文档图像从空间域转换到频率域,生成一个频谱,其中每个点的强度代表了图像中特定频率的幅度。这一变换揭示了图像倾斜度的关键频率成分。

接着,对傅里叶幅度谱进行分析,因为在幅度谱中,文档的倾斜度表现为主导方向。通过识别这些方向,可以估计出倾斜角度。

自适应径向投影是这个方法的核心创新点,它包括两个独立的步骤:

  1. 初始径向投影:这一步用于估计初步的倾斜角度,通过在傅里叶谱的中心发出的径向线上投影幅度来实现。得到最高投影值的径向线指示了图像中文本的主要方向,从而关联到倾斜角度。
  2. 校正投影:这一步骤对初步估计进行细化,考虑到初步投影可能受到文本对齐或图像中非文本元素等因素的影响。校正投影会适应这些因素,以提供更精确的倾斜角度估计。

在通过径向投影识别出主导方向后,计算出相应的倾斜角度。这个角度指示了需要旋转的角度,以便将图像中的文本与水平或垂直轴对齐,从而有效地校正图像的倾斜。

为了提高方法的准确性,还包括了一些额外的步骤,比如考虑傅里叶谱中的直流分量(DC)和低频成分,这对于处理不同类型文档图像非常重要。

具体实践与算法推导可看论文《Adaptive Radial Projection on Fourier Magnitude Spectrum for Document Image Skew Estimation》。

代码实现

首先,使用_get_fft_magnitude()函数计算快速傅里叶变换的幅度,如下所示:

def _ensure_gray(image):try:image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)except cv2.error:passreturn imagedef _ensure_optimal_square(image):assert image is not None, imagenw = nh = cv2.getOptimalDFTSize(max(image.shape[:2]))output_image = cv2.copyMakeBorder(src=image,top=0,bottom=nh - image.shape[0],left=0,right=nw - image.shape[1],borderType=cv2.BORDER_CONSTANT,value=255,)return output_imagedef _get_fft_magnitude(image):gray = _ensure_gray(image)opt_gray = _ensure_optimal_square(gray)# threshopt_gray = cv2.adaptiveThreshold(~opt_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, -10)# perform fftdft = np.fft.fft2(opt_gray)shifted_dft = np.fft.fftshift(dft)# get the magnitude (module)magnitude = np.abs(shifted_dft)return magnitude

然后使用径向投影计算倾斜角度,该投影沿着各种径向线投影傅里叶谱的幅度:

def _get_angle_radial_projection(m, angle_max=None, num=None, W=None):"""Get angle via radial projection.Arguments:------------:param angle_max : :param num: number of angles to generate between 1 degree:param w: :return:"""assert m.shape[0] == m.shape[1]r = c = m.shape[0] // 2if angle_max is None:passif num is None:num = 20tr = np.linspace(-1 * angle_max, angle_max, int(angle_max * num * 2)) / 180 * np.piprofile_arr = tr.copy()def f(t):_f = np.vectorize(lambda x: m[c + int(x * np.cos(t)), c + int(-1 * x * np.sin(t))])_l = _f(range(0, r))val_init = np.sum(_l)return val_initvf = np.vectorize(f)li = vf(profile_arr)a = tr[np.argmax(li)] / np.pi * 180if a == -1 * angle_max:return 0return a

一旦得到倾斜角度,将使用该倾斜角度来校正上述图像的倾斜度。

def correct_text_skewness(image):"""Method to rotate image by n degree:param image::return:"""# cv2_imshow(image)h, w, c = image.shapex_center, y_center = (w // 2, h // 2)# Find angle to rotate imagerotation_angle = get_skewed_angle(image)print(f"[INFO]: Rotation angle is {rotation_angle}")# Rotate the image by given n degree around the center of the imageM = cv2.getRotationMatrix2D((x_center, y_center), rotation_angle, 1.0)borderValue = (255, 255, 255)rotated_image = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderValue=borderValue)return rotated_image...

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day106:代码审计-PHP原生开发篇文件安全上传监控功能定位关键搜索1day挖掘

目录 emlog-文件上传&文件删除 emlog-模板文件上传 emlog-插件文件上传 emlog-任意文件删除 通达OA-文件上传&文件包含 知识点: PHP审计-原生开发-文件上传&文件删除-Emlog PHP审计-原生开发-文件上传&文件包含-通达OA emlog-文件上传&文件…

基于YOLOv8的摄像头下铁路工人安全作业检测系统

💡💡💡本文摘要:基于YOLOv8的铁路工人安全作业检测系统,属于小目标检测范畴,并阐述了整个数据制作和训练可视化过程, 博主简介 AI小怪兽,YOLO骨灰级玩家,1&#xff0…

【计算机考研】408网课汇总+资源分享

王道的四件套无疑是大多数同学的首选。相比其他课程来说,也是属于市面上最好的408课程了。 从今年的难度来看选择题部分和计网,比起往年来看是有很多偏题,大题除了计网的冷门外,其他倒是中规中矩。总体来看24考研的408难度是非常…

Vue - 4( 8000 字 Vue 入门级教程)

一: Vue 初阶 1.1 关于不同版本的 Vue Vue.js 有不同版本,如 vue.js 与 vue.runtime.xxx.js,这些版本主要针对不同的使用场景和需求进行了优化,区别主要体现在以下几个方面: 完整版 vs 运行时版: vue.js&…

软件可靠性基本概念_1.定义和定量描述

1.软件可靠性定义 软件可靠性(Software Reliability)是软件产品在规定的条件下和规定的时间区间完成规定功能的能力。规定的条件是指直接与软件运行相关的使用该软件的计算机系统的状态和软件的输入条件,或统称为软件运行时的外部输入条件&am…

LeetCode-2529题:正整数和负整数的最大计数(原创)

【题目描述】 给你一个按 非递减顺序 排列的数组 nums ,返回正整数数目和负整数数目中的最大值。换句话讲,如果 nums 中正整数的数目是 pos ,而负整数的数目是 neg ,返回 pos 和 neg二者中的最大值。注意:0 既不是正整…

开启RabbitMQ的WEB管理功能。

前言 今天讲下如何快速开启RabbitMQ的WEB管理功能,以及遇到的问题。 前期准备,需要安装好docker、docker-compose的运行环境。 一、安装RabbitMQ 1、创建相关目录,执行如下命令。 mkdir -p /docker/rabbitmq/data cd /docker/rabbitmq 2…

【数据结构】考研真题攻克与重点知识点剖析 - 第 7 篇:查找

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

无人机低空数字摄影测量系统

一、 系统概述 系统完全基于IDL设计实现,包括界面布局到人机交互再到底层核心函数功能。整体设计框架基于数字摄影测量的专业处理流程,实现了数据输入、数据预处理、影像信息检测、空间定向、地形三维建模、专题信息提取、成果输出与更新等功能。同时为…

【教程】App打包成IPA文件类型的四种方法

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法,包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景,在实际开发中可以根据需求选择合适的方式进行打包。通过本教程,您将了解到…

Linux--进程的概念(二)

目录 一、进程的优先级1.1 基本概念1.2 查看进程优先级1.3 PRI&NI1.4 如何更改进程的优先级1.4.1 用top命令更改进程的nice1.4.2 用renice命令更改进程的nice 1.5 其他概念 二、环境变量2.1 基本概念2.2 常见的环境变量2.3 查看环境变量2.3.1 测试PATH2.3.2 测试HOME2.3.3 …

Adobe Photoshop 2024 v25.6强大的图形编辑工具

Adobe Photoshop 2024是一款非常强大的图像处理软件,具有丰富的功能和工具,可以满足各种图像处理需求。 软件下载:Adobe Photoshop 2024 v25.6中文激活版 它不仅支持基本的图像编辑和调整,还具有高级的特性,如智能对象…

自定义类型—结构体

目录 1 . 结构体类型的声明 1.1 结构的声明 1.2 结构体变量的创建与初始化 1.3 结构体的特殊声明 1.4 结构体的自引用 2. 结构体内存对齐 2.1 对齐规则 2.2 为什么存在内存对齐 2.3 修改默认对齐数 3. 结构体传参 4.结构体实现位段 4.1 位段的内存分配 1 . 结构体类…

idea中jdk版本的配置

配置JDK版本的步骤如下: 下载JDK安装文件:首先,需要从Oracle官方网站(https://www.oracle.com/java/technologies/javase-jdk8-downloads.html)下载适合您操作系统的JDK版本。 安装JDK:双击下载的安装文件…

LangChain-15 Manage Prompt Size 管理上下文大小,用Agent的方式询问问题,并去百科检索内容,总结后返回

背景描述 这一节内容比较复杂: 涉及到使用工具进行百科的检索(有现成的插件)有AgentExecutor来帮助我们执行后续由于上下文过大, 我们通过计算num_tokens,来控制我们的上下文 安装依赖 pip install --upgrade --qu…

Cherno CPP学习笔记-01-背景知识

0、工具网站收集 C语言版本特性 https://en.cppreference.com https://www.cplusplus.com https://www.tutorialspoint.com/cplusplus https://www.learncpp.com https://github.com/fffaraz/awesomecpp https://stackoverflow.com 网页CPP编译器 [C] gcc 12.1.0 - Wa…

SpringBoot集成Skywalking日志收集

在实际项目中,为了方便线上排查问题,尤其是微服务之间调用链路比较复杂的系统中,通过可视化日志的手段仍然是最直接也很方便的排查定位问题的手段,比如大家熟悉的ELK就是一种比较成熟的可视化日志展现方式,在skywalkin…

在Windows电脑上上传iOS应用至App Store

引言 📱 使用UniApp开发iOS应用十分便捷,一套代码即可兼容多个平台。然而,UniApp开发iOS应用需要进行证书打包和将IPA文件上传至App Store,这两个步骤通常需要在Mac电脑上完成。那么,如果我们使用的是Windows开发环境…

Linux:gcc

Linux:gcc gcc概述语言发展史gcc的编译过程预处理编译汇编 gcc的链接过程动态库与静态库 gcc概述 GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目: 题解: char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…