这里主要记录下我在工作中对倾斜字体文本行的校正的方法探索,废话不多,一起说来看看吧。


目录

一、算法流程图

二、算法实现

2.1、预处理

2.2、水平模糊

2.3、垂直投影

2.4、短斜线倾斜角度的统计计算

2.5、倾斜校正

三、算法实现的最终结果


实现倾斜文本行字体的校正主要分为两部分,一部分为倾斜角度的检测,另一部分为倾斜校正。其中倾斜角度的检测极为重要,他关系到后续的校正。

一、算法流程图

二、算法实现

2.1、预处理

原始图片:

这里主要是灰度化、滤波以及二值化,结果如下:

2.2、水平模糊

水平模糊也叫做游程平滑。是将图像上长度小于某一域值的连续黑点转为白点的演算法则。图像经模糊算法处理后, 图像上距离相近的连通成份将会形成为一较大的连通区域。

def horizontal_blur(image):'''水平平滑'''dst=image#计算图像的字符宽度hor_vec=np.sum(dst,axis=0)width=hor_vec.shape[0]left=right=0for i in range(width):if hor_vec[i]!=0:left=ibreakfor j in range(width-1,-1,-1):if hor_vec[j]!=0:right=jbreakchar_width=right-left+1 if right-left+1>0 else 10# 计算游程平滑阈值thres=char_width//10h,w=dst.shapefor r in range(h):c=0while c<w and dst[r,c]==0:c+=1max_w=0for i in range(w-1,-1,-1):if dst[r,i] !=0:max_w=ibreakstart=0end=0flag=Truefor j in range(c,max_w):if flag and dst[r,j]==0:start=jflag=Falseif not flag and dst[r,j]!=0:end=jif end>start and end-start <= thres:k=startwhile k<end:dst[r,k]=255k+=1flag=Truereturn dst

处理后的结果如下:

2.3、垂直投影

这个很好计算,这里不多介绍。直接看结果:

2.4、短斜线倾斜角度的统计计算

1、垂直投影测角原理

把斜体字进行抽象,可以看成是一平行四边形。一般地,对于一个由黑象素组成的实心平行四边形图像,其垂直投影直方图是一梯形 。具体如下:

那么倾斜角度的计算公式为:

也就是说我们可以通过上图第二个图来计算倾斜字体的角度,而第二张图就是我们的投影曲线了。所以我们计算投影曲线的角度也就是我们的倾斜角度。

但从2.3中的投影图可知, 首先, 水平模糊后斜体字部分并非理想的平行四边形, 其次, 模糊图中存 在多个倾斜的边和倾斜角度信息, 但由于计算误差等原因, 可能存在一些错误的倾斜角度信息, 必须对所有倾斜角度信 息进行统计分析, 才可以获得更准确的测角信息。

需要注意的是:模糊区域边界部分投影曲线形状与字符 结构有较大关系, 例如字符边界不是竖直笔画 ( 英文字母 X)或边界笔画反而会干扰倾斜角度取得的字符 ( A, W等 ), 因此并非所有短斜线的斜率都是斜体字的斜率。 一般地, 正确的折线数量大于不正确的 。基于此, 本文在设计算法时采用 投票法来获取正确角度, 即对于得到的所有角度, 通过投票获知哪个角度出现的次数最多, 该角度就是要找的倾斜角度。

2、代码实现

这里代码不多详述,因为代码是公司的,所以能不能再贴了,有需要的小伙伴可以私底下聊,我会经量帮你解决。

2.5、倾斜校正

图像中倾斜字的校正实际上就是象素坐标的空间旋转 变换。 假设倾斜字符向右扭曲, X轴与水平轴重合, Y轴所 指方向为字符扭曲方向。如果将字符图像水平旋转使 Y轴 所指方向与水平轴垂直, 则校正了图像的变形。 现以一倾斜 字符“中”为例, 推导空间变换公式如下:

旋转时 A点以下的字符部分水平右移, 以上部分水平左 移。 以 B点为例, 设旋转后的坐标值为 (i, j), 易知水平右移 时纵坐标不变, 横坐标增加BC, 则变换公式为 :
同理, 左移部分变换公式为:
然而图像中点的坐标值仍然为整数, 因此经过变换后所获得的结果必须进行取整操作, 这就存在误差, 不可避免地造成图像失真。本文采用双线性插值来降低取整带来的失真, 并对校正后的二值图像进行平滑处理, 以消除插值带来的毛刺点。
具体实现如下:
def bilinear_interpolation(image,angle,center,y_min,y_max):'''对倾斜字体进行双线性插值'''center_x, center_y=centerh,w=image.shapedst=np.zeros((h,w),dtype=np.uint8)for r in range(h):for c in range(w):#计算原图上的坐标i = rif r<center_y:j=c+(center_y-r)/math.tan(angle)elif r>center_y:j=c-(r-center_y)/math.tan(angle)else:j=c#计算源图上的四个近邻点x_0=max(int(np.floor(j)),0)y_0=max(int(np.floor(i)),0)x_1=min(x_0+1,w-1)y_1=min(y_0+1,h-1)#双线性插值if (x_0 >=x_1) or (y_0>=y_1):continuevalue0=((x_1-j)*image[y_0,x_0]+(j-x_0)*image[y_0,x_1])value1=((x_1-j)*image[y_1,x_0]+(j-x_0)*image[y_1,x_1])dst[r,c]=int(((y_1-i)*value0+(i-y_0)*value1))return dstdef correct_slanted_fonts(image,mask,angle):'''倾斜字体的矫正'''h,w=mask.shape# 计算倾斜字体的中心点center_x=0center_y=0num=0for r in range(h):for c in range(w):if mask[r,c]==255:center_x+=ccenter_y+=rnum+=1center_x=center_x//numcenter_y=center_y//num#计算文本的上下边界ver_vec=np.sum(mask,axis=1)up=0down=0h=ver_vec.shape[0]for i in range(h):if ver_vec[i]!=0:up=ibreakfor i in range(h-1,-1,-1):if ver_vec[i]!=0:down=ibreak#对图像进行双线性插值dst=bilinear_interpolation(image,angle,(center_x,center_y),up,down)# cv2.namedWindow("test1",0)# cv2.imshow("test1", dst)# cv2.waitKey(0)return dst

三、算法实现的最终结果

现在让我们来看看我们的需要校正的文本数据样例,部分具体样例图片如下:

最终我们校正后的结果:

参考文献:

一种斜体印刷字倾斜角度检测算法

基于opencv的倾斜文本行的校正相关推荐

  1. 实战:基于OpenCV实现偏斜文档校正

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|OpenCV学堂 纸质文档扫描中经常会发生扫描出来的图像有 ...

  2. Python——基于OpenCV获取倾斜子图的一种方法

    解决方案 #!usr/bin/env python # -*- coding:utf-8 _*- """ @version: 0.0.1 author: ShenTuZh ...

  3. 【论文阅读】Attention 机制在脱机中文手写体文本行识别中的应用

    论文信息: 作者: 王馨悦,董兰芳 ( 中国科学技术大学计算机科学与技术学院,合肥230027) E-mail: wxy66@ mail. ustc. edu. cn 该方法在针对具有语义信息的CAS ...

  4. 使用OpenCV实现偏斜文档校正

    在这篇文章中: 使用OpenCV实现偏斜文档校正 基于FFT变换以后频率域梯度 基于离散点求最小外接轮廓 运行结果 使用OpenCV实现偏斜文档校正 纸质文档扫描中经常会发生扫描出来的图像有一定角度的 ...

  5. 基于边缘检测和透视变换的文档图像校正

    实验任务与要求: 对发生透视变换的文档图像进行几何校正处理,得到规范的文档图像. 几何校正的目的是把发生了透视变换的目标变换为具有真实比例和角度的目标,如下图所示:左图中的地板砖经过透视变换之后,不再 ...

  6. 倾斜文档扫描与ocr识别(opencv,坐标变换)

    目录 1.项目数据及源码 2.图像预处理 3.获取最优轮廓 3.1.轮廓提取 3.2.筛选轮廓 4.原始与变换坐标计算 5.显示识别结果 5.1.图像处理 5.2.修改图片大小,并逆时针旋转90度 5 ...

  7. 基于C++的OpenCV项目实战——文档照片转换成扫描文件

    基于C++的OpenCV项目实战--文档照片转换成扫描文件 一.背景 前段时间都是基于Python的OpecCV进行一些学习和实践,但小的知识点并没有应用到实际的项目中:并且基于Python的版本的移 ...

  8. 智能图像处理:基于边缘去除和迭代式内容矫正的复杂文档图像校正

    本文简要介绍ACM MM 2022录用论文"Marior: Margin Removal and Iterative Content Rectification for Document D ...

  9. opencv对图像是软解码_基于opencv和c++的图像处理软件设计与实现(26页)-原创力文档...

    毕业设计中文摘要 基于opencv和c++的图像处理软件设计与实现 摘要: 本文主要对基于opencv和c++的图像处理软件设计与实现进行介绍.本软件由主界面和若干二级菜单组成,主界面功能有文件操作. ...

最新文章

  1. linux 进程防火墙连接管理,Linux系统管理初步(五)系统防火墙控制程序firewalld...
  2. Oracle 原理:逻辑备份和恢复
  3. mysql 优化 类型_MySQL数据类型的优化选择
  4. javaweb学习总结(十九)——JSP标签
  5. vlc android 移植版编译
  6. spring配置jndi_在Spring Framework中通过JNDI进行配置
  7. oracle查询结果存入临时表,Oracle查询问题引发临时表使用
  8. linux 重新分区 调整,重新调整磁盘分区linux / vm的大小
  9. 随机化算法-数值随机化算法
  10. android expandablelistview横向,Android ExpandableListView使用小结(二)
  11. VS2013解决error LNK2019: 无法解析的外部符号 mfcs120ud.lib
  12. 容量耦合系数模型_使用Fluent电芯仿真模型进行结构设计优缺点分析
  13. vs2017官方下载地址
  14. unraid win10_搞定unraid直通核显给WIN10后黑屏、声卡无输出问题
  15. 写论文与PPT汇报时matlab图片的背景透明处理
  16. 用c++随机生成10小学生算术题的课设
  17. 全球最顶级的十大创新公司
  18. SQLPub免费的MySQL数据库
  19. kgdb+Qemu-kvm调试环境建立方法和所需的相关文件
  20. 看完让你彻底理解 WebSocket 原理

热门文章

  1. Hbuilder上架苹果app流程(上)
  2. enovia之Spinner开发
  3. 中医大计算机考试题目,中医大计算机复习题-20210319205538.docx-原创力文档
  4. 给定一个递增序列,a1 a2 ...an 。定义这个序列的最大间隔为d=max{ai+1 - ai }(1≤in),现在要从a2 ,a3 ..an-1 中删除一个元素。问剩余序列的最大间隔最小...
  5. oracle11g磁盘阵列 pdf,融会贯通 从Oracle11g到SQL Server2008 中文PDF版 16.7MB
  6. 本地编码修改和编码详解
  7. Tesla_T4加速卡详细参数
  8. C++ 中的线程库和 lamber 表达式
  9. 【闲聊】人生如梦,一樽还酹江月
  10. 实战项目——智能农业沙盘