opencv离散傅里叶变换进行图像旋转校正

前言

离散傅立叶变换的一个应用是决定图片中物体的几何方向。

In case of normal text   In case of rotated text

观察这两张幅度图你会发现频域的主要内容(幅度图中的亮点)是和空间图像中物体的几何方向相关的。 通过这点我们可以计算旋转角度并修正偏差。

官网:

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/discrete_fourier_transform/discrete_fourier_transform.html#discretfouriertransform

一直以来跟傅里叶变换打交道,以前看了那么多长篇、课本式介绍,这次看到官网上对傅里叶变换的阐述,觉得很清晰,忍不住想再复述一遍。

原理

对一张图像使用傅立叶变换就是将它分解成正弦和余弦两部分。也就是将图像从空间域(spatial domain)转换到频域(frequency domain)。 这一转换的理论基础来自于以下事实:任一函数都可以表示成无数个正弦和余弦函数的和的形式。傅立叶变换就是一个用来将函数分解的工具。 2维图像的傅立叶变换可以用以下数学公式表达:

F(k,l) = \displaystyle\sum\limits_{i=0}^{N-1}\sum\limits_{j=0}^{N-1} f(i,j)e^{-i2\pi(\frac{ki}{N}+\frac{lj}{N})}  e^{ix} = \cos{x} + i\sin {x}

式中 f 是空间域(spatial domain)值, F 则是频域(frequency domain)值。 转换之后的频域值是复数, 因此,显示傅立叶变换之后的结果需要使用实数图像(real image) 加虚数图像(complex image), 或者幅度图像(magitude image)加相位图像(phase image)在实际的图像处理过程中,仅仅使用了幅度图像,因为幅度图像包含了原图像的几乎所有我们需要的几何信息。 然而,如果你想通过修改幅度图像或者相位图像的方法来间接修改原空间图像,你需要使用逆傅立叶变换得到修改后的空间图像,这样你就必须同时保留幅度图像和相位图像了。

参考官网的代码就可以实现如下效果:

  

进行检测直线对倾斜的图片(上图倾斜的lena)进行校正

扫描二维码关注公众号,回复: 3263402 查看本文章

参考博客:http://johnhany.net/2013/11/dft-based-text-rotation-correction/

   

就像博主说的,其中二值化阈值参数GRAY_THRES 和霍夫变换检测一条直线所需的最少曲线交点的参数 HOUGH_VOTE,要手动调节,不同的图像需要设置不同的参数,分别测试三种,一种上图1,先旋转之后再校正,但是出来结果是如下这样,设置旋转的角度是27,检测直线之后计算出来的是63,是互余的关系,可是怎么也调不正

第二种,就是上图2的结果,虽然校正回来了,但是我是在最后校正回来的角度那里减去90度才得到的 

第三种,就是像博主那样用文本图像,是可以校正回来的

博主@ JohnHany 也说到倾斜角度(与竖直方向的夹角)根据角度在[0,90]和 [90,180]会有不同,以及opencv,逆时针方向为正,不过目前我脑袋里仍然是一片混乱,此问题暂时放在这里吧,欢迎广大博友帮忙解惑!

猜你喜欢

转载自blog.csdn.net/naozhuo0615/article/details/82587948