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

2024-04-06 14:52

本文主要是介绍计算机视觉——基于傅里叶幅度谱文档倾斜度检测与校正,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

在计算机视觉领域,处理文档数据时,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.chinasem.cn/article/880134

相关文章

Python操作PDF文档的主流库使用指南

《Python操作PDF文档的主流库使用指南》PDF因其跨平台、格式固定的特性成为文档交换的标准,然而,由于其复杂的内部结构,程序化操作PDF一直是个挑战,本文主要为大家整理了Python操作PD... 目录一、 基础操作1.PyPDF2 (及其继任者 pypdf)2.PyMuPDF / fitz3.Fre

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python Pillow 库详解文档(最新推荐)

《PythonPillow库详解文档(最新推荐)》Pillow是Python中最流行的图像处理库,它是PythonImagingLibrary(PIL)的现代分支和继承者,本文给大家介绍Pytho... 目录python Pillow 库详解文档简介安装核心模块架构Image 模块 - 核心图像处理基本导入

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.