用户在使用Android手机拍摄过程中难免会出现文本图像存在旋转角度。这里采用霍夫变换、边缘检测等数字图像处理算法检测图像的旋转角度,并根据计算结果对输入图像进行旋转矫正。

首先定义一个结构元素,再通过该结构元素对该图像进行开运算和闭运算(即腐蚀膨胀运算)。

Imgproc.cvtColor(matOri, matGray, Imgproc.COLOR_RGB2GRAY);
Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, new Size(20,20));
Imgproc.morphologyEx(matGray, matGray, Imgproc.MORPH_OPEN, kernel);
Imgproc.morphologyEx(matGray, matGray, Imgproc.MORPH_CLOSE, kernel);

然后调用Imgproc.threshold方法把原灰度图转换为二值图。

Imgproc.threshold(matGray, matGray, 80, 255, Imgproc.THRESH_BINARY);

接着通过Canny边缘检测算子来检测边界。参数为edges输出的边缘图像,threshold1和threshold2 当中的小阈值用来控制边缘连接。
利用霍夫变换在二值图中寻找直线,然后遍历所有的直线调用Math.atan来计算直线的角度。过滤掉一些角度过于大的直线和非法角度得到该图像该旋转的角度,再旋转该矩阵即可。

Mat edges = new Mat();
Imgproc.Canny(matGray, edges, 20, 160);
Mat lines = new Mat();//检测到的直线集合
Imgproc.HoughLinesP(edges, lines, 1, Math.PI/180, 45, 20, 20);

最后采用重投影技术矫正图像旋转:调用OpenCV函数Imgproc.getRotationMatrix2D()构建旋转矩阵,调用函数Imgproc.warpAffine()构建旋转后的图像。

旋转的角度如下图:

采用重投影技术矫正图像旋转如图:

OpenCV文本图像的旋转矫正的更多相关文章

  1. (原)使用opencv的warpAffine函数对图像进行旋转

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5070576.html 参考网址: http://stackoverflow.com/questions ...

  2. opencv人脸检测,旋转处理

    年会签到,拍自己的大头照,有的人可能会拍成横向的,需要旋转,用人脸检测并修正它(图片). 1. 无脑检测步骤为: 1. opencv 读取图片,灰度转换 2. 使用CascadeClassifier( ...

  3. 利用OpenCV给图像添加中文标注

    利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html  和https://blog.csdn.net/ ...

  4. [OpenCV-Python] OpenCV 中图像特征提取与描述 部分 V (一)

    部分 V图像特征提取与描述 OpenCV-Python 中文教程(搬运)目录 29 理解图像特征 目标本节我会试着帮你理解什么是图像特征,为什么图像特征很重要,为什么角点很重要等.29.1 解释 我相 ...

  5. 为训练深度OCR 图像,生成文本图像

    https://github.com/Sanster/text_renderer Generate text images for training deep learning ocr model 在 ...

  6. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  7. C#使用OpenCV剪切图像中的圆形和矩形

    前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.C ...

  8. Java基于opencv实现图像数字识别(五)—投影法分割字符

    Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...

  9. Java基于opencv实现图像数字识别(四)—图像降噪

    Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...

随机推荐

  1. Asp.net MVC 自定义路由

    在做公司接口的时候  由于规范API 要用点分割. 如: HealthWay.controller.action 在MVC 4 下面做了个 路由配置如下: public override void R ...

  2. django That port is already in use

    python 直接在命令行里启动,如果取消运行,可能会报错,解决方法如下 ps aux | grep -i manage 找出manage.py 对应的pid号码 第二步删除对应的进程 kill -9 ...

  3. windows下gitbook与开源中国码云关联,以及如何gitbook转pdf

    gitbook能够很方便的和github关联,实现团队协作的效果.可是github私有库需要付费.但是开源中国码云能够建私有库,于是考虑将gitbook关联码云,折腾了一番后,能够可视化的关联,后面就 ...

  4. django drf GenericAPIView和ListAPIView

    drf提供了更快捷的查询方法ListModelMixin+GenericAPIView,和ListAPIView 1.ListModelMixin+GenericAPIView from django ...

  5. 加密--HashPasswordForStoringInConfigFile过时问题

    最近公司在对一套代码进行重构,把原本的web form换成mvc. 刚刚好几天打算开始做下登录,登录则必然会涉及到密码加密的问题. 原本打算用旧的加密方法就行了,哪里知道其中的md5加密出现了这样的问 ...

  6. 数据库_mysql多表操作

    多表操作        实际开发中,一个项目通常需要很多张表才能完成.例如:一个商城项目就需要分类表(category).商品表(products).订单表(orders)等多张表.且这些表的数据之间 ...

  7. Spring各个jar包详解

    Spring各jar包详解 spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar,aspects.jar, spring-portlet.jar, and sprin ...

  8. Jquery 【on事件】

    一.on事件的定义和用法 on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方 ...

  9. linux LVM 磁盘管理

    一.linux LVM 管理及创建步骤 步骤:1.创建pv—2.创建vg—3.将pv加入vg—4.在vg中创建lv—5.将lv分区格式化—6.将lv分区挂载到某个目录使用 1.创建PV [root@z ...

  10. linux awk 文本分析实例 [视频]

    实例: 点我打开哔哩哔哩 实战: 点我打开哔哩哔哩 以下是一个分享: ➜ log Time Now 16:23:35 > awk '/Installed/' yum.log* | awk -F ...