利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码

Posted 清溪算法老号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码相关的知识,希望对你有一定的参考价值。

对图像进行旋转矫正,关键是要获取旋转角度是多少!获取了旋转角度就可以用仿射变换对图像进行矫正,图像旋转的代码可以参考我的博文http://blog.csdn.net/wenhao_ir/article/details/51469085

旋转角度怎么获取?可以对图像作傅里叶变换获取这个角度,具体怎么求,请听我慢慢道来!

文本图像的明显特征就是存在分行间隔,那么行与文字之间这个灰度值变化就不如真正的文字及文字间的变化剧烈,那么相应的这些地方的频谱值也低,即频谱的低谱部分,因为傅里叶变换就是表征图像各点的变化频率的嘛~当文本图像旋转时,基频域中的频谱也会随之改变,那么我就可以根据这一特点来计算这个角度。

具体的步骤如下

读取图像,读出的同时转化为灰度图像,代码如下:

代码中用到的图像的下载链接为:http://pan.baidu.com/s/1miMuqJQ

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

⑵图像DFT尺寸变换,快速傅里叶变换是基于图像尺寸是2、3或5的倍数完成的,因此对于输入源图像,首先应将其变换成DFTSize,OpenCV中提供了函数getOptimalDFTSize()来实现尺寸转换。

图像DFT尺寸转换代码下如下:

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

运行结果如下图所示:

⑶DFT变换,源代码如下:具体的原理可以参考我写的博文http://blog.csdn.net/wenhao_ir/article/details/51142979

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

运行结果如下图所示

⑷频域中心移动

提问:为什么要进行频域中心的移动?答案在我的博文http://blog.csdn.net/wenhao_ir/article/details/51689960

我这里对这个问题再补充说几句吧
傅里叶变换得到的低频部分在边缘角中,高频部分位于图像中心,对于倾斜文本图像,我们更关心的是图像中的低频部分,因此需要将其与高频部分互换中心。

代码如下:

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

运行结果如下图所示:

⑸倾斜角检测。经过频域中心移动后,由上图可以看出,只需要检测出图像中直线的倾斜角就可以对旋转文本进行校正。计算直线倾斜角有多种方法,这里采用霍夫变换线 检测方法进行直线倾斜角的计算,首先将傅里叶变换后的频谱图进行固定二值化处理,这里阈值的选择和场景有很大关系,要根据实际应用场景进行合理调整;然后根据霍夫变换检测直线的步骤来完成图像中的直线检测,具体霍夫变换的原理我后面会写博文介绍;直线检测完了后计算图像直线的角度,然后用这个角度对原图进行仿射变换矫正。

倾斜角检测的代码如下:

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

运行结果如下图所示:

实际上,这幅图像我在美图秀秀中旋转了20度左右,可见,程序得出的角度是非常OK的!

⑹仿射变换矫正。对得到的线角度计算旋转矩阵,利用仿射变换完成旋转文本矫正。

仿射变换矫正代码如下:

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

运行结果如下图所示:

可见,矫正的效果是很好的。

最后再给大家一个完整版的代码吧!

代码中用到的图像的下载链接为:http://pan.baidu.com/s/1miMuqJQ

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

代码请访问https://blog.csdn.net/lehuoziyuan/article/details/84135634获取

 

以上是关于利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码的主要内容,如果未能解决你的问题,请参考以下文章

图像处理-图像的旋转及变换

如何利用opencv计算图像畸变系数,并进行校正与摄像机标定?

opencv 图像平移缩放旋转翻转 图像仿射变换

OpenCV利用矩阵实现图像旋转

实战用OpenCV实现页面扭曲矫正

opencv实战——图像矫正算法深入探讨