文档图像倾斜校正算法(1)——文本行投影法
原理:沿着文本行的方向对文本行进行投影得到的投影值集合,要比其他方向投影值集合的方差要大。
适用范围:投影求方差的方法适用于图像局部变形较小,干扰少的文档图像。在实现时可以先在图像中扣取一块文本行清晰的图像,再在扣取的小图上采用该方法进行图像倾斜校正。
下面代码是在做火车票识别时的倾斜校正程序,利用二维码检测的位置框取一部分文档图像,再使用该部分文档图像完成倾斜校正(只放了倾斜校正的代码):
#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