当前位置:   article > 正文

文档图像倾斜校正算法(3)——二位傅里叶变化法倾斜校正_基于傅里叶变化 文档倾斜角度检测

基于傅里叶变化 文档倾斜角度检测

文档图像倾斜校正算法(3)——二位傅里叶变化法倾斜校正

原理:文本行具有一定的纹理信息,通过傅里叶变换后在频域中会凸显出来。

适用范围:二位傅里叶变化法倾斜校正需要有明显的频域信息时才能生效。为得到更显著的频域特征,在使用时一般会先对文档图像的的二值化图像进行文本区域融合。但是对于文档中文字稀疏,频域特征不明显的文档该方法会失效。该方法能弥补文本行投影法在短文本倾斜矫正时的不足:短文本,尤其是文本行存在错行时,使用投影法难以对倾斜文档图像进行校正,二维傅里叶变换法采用全局信息进行倾斜矫正,能得到较为理想的结果,但是当背景纹理过于突出时也会失效,所以建议先截取文档图像中的关键区域再进行倾斜校正。
在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
#include <numeric>
#define MY_SKEW 14

//图像旋转1:旋转(截取图像)Crop
//         Mat img :图像输入,单通道或者三通道
//         Mat & imgout :图像输出
//         int degree :图像要旋转的角度
//         int border_value:图像旋转填充值
int rotateImage1(Mat img,Mat & imgout, int degree,int border_value)
{
   
    if( img.empty())
        return 1;
    degree = -degree;//warpAffine默认的旋转方向是逆时针,所以加负号表示转化为顺时针
    double angle = degree  * CV_PI / 180.; // 弧度  
    double a = sin(angle), b = cos(angle);
    int width = img.cols;
    int height = img.rows;
    int width_rotate = int(width * fabs(b)-height * fabs(a));//height * fabs(a) +
    int height_rotate = int(height * fabs(b)-width * fabs(a));//width * fabs(a) +
    if(width_rotate<=20||height_rotate<=20)
    {
   
        width_rotate = 20;
        height_rotate = 20;
    }
    //旋转数组map
    // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
    // [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]
    float map[6];
    Mat map_matrix = Mat(2, 3, CV_32F, map);
    // 旋转中心
    CvPoint2D32f center = cvPoint2D32f(width / 2, height / 2);
    CvMat map_matrix2 = map_matrix;
    cv2DRotationMatrix(center, degree, 1.0, &map_matrix2);//计算二维旋转的仿射变换矩阵
    map[2] += (width_rotate - width) / 2;
    map[5] += (height_rotate - height) / 2;
    //Mat img_rotate;
    //对图像做仿射变换
    //CV_WARP_FILL_OUTLIERS - 填充所有输出图像的象素。
    //如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.
    //CV_WARP_INVERSE_MAP - 指定 map_matrix 是输出图像到输入图像的反变换,
    int chnnel =img.channels();
    if(chnnel == 3)
        warpAffine(img, imgout, map_matrix, Size(width_rotate, height_rotate), 1, 0, Scalar(border_value,border_value,border_value));
    else
        warpAffine(img, imgout, map_matrix, Size(width_rotate, height_rotate), 1, 0, border_value);
    return 0;
}

//图像旋转2:扩充图像边缘full
//         Mat img :图像输入,单通道或者三通道
//         Mat & imgout :图像输出
//         int degree :图像要旋转的角度
//         int border_value:图像旋转填充值
int rotateImage2(Mat img,Mat & imgout, int degree,int border_value)
{
   
    if
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/356328
推荐阅读
相关标签
  

闽ICP备14008679号