文章目录
图像校正运行环境
Anaconda| pycharm/jupyter notebook
你需要安装如下库
一、基于傅里叶变换的图像矫正
由于拍照时,图像被旋转,为方便观看或使用,需要对旋转图像进行校正。
旋转图像矫正流程
思路借鉴 http://johnhany.net/2013/11/dft-based-text-rotation-correction/
1.1 傅里叶变换原理
2维图像的傅立叶变换可以用以下数学公式表达:
式中 是空间域(spatial domain)值,
转换之后的频域值是复数, 因此,显示傅立叶变换之后的结果需要使用实数图像(real image) 加虚数图像(complex image), 或者幅度图像(magitude image)加相位图像(phase image)。 在实际的图像处理过程中,仅仅使用了幅度图像,因为幅度图像包含了原图像的几乎所有我们需要的几何信息。然而,如果你想通过修改幅度图像或者相位图像的方法来间接修改原空间图像,你需要使用逆傅立叶变换得到修改后的空间图像,这样你就必须同时保留幅度图像和相位图像了。
在此示例中,我将展示如何计算以及显示傅立叶变换后的幅度图像。由于数字图像的离散性,像素值的取值范围也是有限的。比如在一张灰度图像中,像素灰度值一般在0到255之间。 因此,我们这里讨论的也仅仅是离散傅立叶变换(DFT)。 如果你需要得到图像中的几何结构信息,那你就要用到它了。
在频域里面,对于一幅图像,高频部分代表了图像的细节、纹理信息;低频部分代表了图像的轮廓信息。如果对一幅精细的图像使用低通滤波器,那么滤波后的结果就剩下了轮廓了。这与信号处理的基本思想是相通的。如果图像受到的噪声恰好位于某个特定的“频率”范围内,则可以通过滤波器来恢复原来的图像。傅里叶变换在图像处理中可以做到:图像增强与图像去噪,图像分割之边缘检测,图像特征提取,图像压缩等等。
1.2 傅里叶变换过程一系列函数
1 . 将图像延展到最佳尺寸(提高运行速度)
- getOptimalDFTSize():返回给定尺寸的傅里叶最优尺寸大小,提高运行速度(需要扩充图像,填充多少由此函数计算得到:被计算的数字序列长度vecsize为2的n次幂或者能够分解成2,3,5的乘积)
- copyMakeBorder() 边界扩充函数
2 . 为傅立叶变换的结果(实部和虚部)分配存储空间. 傅立叶变换的结果是复数,这就是说对于每个原图像值,结果是两个图像值。 此外,频域值范围远远超过空间值范围, 因此至少要将频域储存在 float 格式中。 结果我们将输入图像转换成浮点类型,并多加一个额外通道来储存复数部分
3 . 进行离散傅立叶变换. 支持图像原地计算 (输入输出为同一图像):
- dtf() :对一维或者二维浮点数数组进行正向或反向傅里叶变换
4 . 将复数转换为幅度复数包含实数部分(Re)和复数部分 (imaginary - Im)。 离散傅立叶变换的结果是复数,对应的幅度可以表示为:
- magnitude() 计算二维矢量的幅值
5 . 对数尺度(logarithmic scale)缩放. 傅立叶变换的幅度值范围大到不适合在屏幕上显示。高值在屏幕上显示为白点,而低值为黑点,高低值的变化无法有效分辨。为了在屏幕上凸显出高低变化的连续性,我们可以用对数尺度来替换线性尺度:
- log() 自然对数函数
6 . 剪切和重分布幅度图象限.将新添加的像素剔除。为了方便显示,我们也可以重新分布幅度图象限位置(注:将第五步得到的幅度图从中间划开得到四张1/4子图像,将每张子图像看成幅度图的一个象限,重新分布即将四个角点重叠到图片中心)。 这样的话原点(0,0)就位移到图像中心。
7 . 归一化. 将像素值归一到 float(0,1) 再乘以 255用于显示 。
- normalize() 矩阵归一化函数
1.3 图像矫正处理流程
- 获取图像的傅里叶变换图
- 二值化
- Hough直线检测
- 计算倾斜角度
- 旋转校正
二、旋转图像矫正
图像旋转校正思路如下
- 读入,灰度化
- 高斯模糊
- 二值化图像
- 闭开运算
- 获取图像顶点
- 旋转矫正
三、基于透视的图像矫正
3.1 直接变换
- 获取图像四个顶点
- 形成变换矩阵
- 透视变换
3.2 自动获取图像顶点变换
- 以灰度图读入
- 腐蚀膨胀,闭合等操作
- 二值化图像
- 获取图像顶点
- 透视矫正
直接获取图像轮廓矫正
该方法不具有普适性,只针对比较干净对比度高的图像,只提供一种思路
获取图像轮廓顶点矫正
C++ 自动化透视变换