图片矫正

一、透视变换       

        在平面图片处理时,因为镜头角度等原因,容易导致图像出现倾斜、变形等情况。为了方便后续处理常常需要进行图像矫正,其中主要技术原理是两种变换类型--仿射变换(Affine Transformation)和透视变换(Perspective Transformation)。

        仿射变换是二维坐标间的线性变换, 故而变换后的图像仍然具有原图的一些性质,包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotations)、平移(Translations)、缩放(Scale operations)等,具体到代码应用可以参见OpenCV官方介绍。

        但是仿射变换不能矫正一些变形,如矩形区域的部分发生变化最终变成梯形,这时候矫正就需要用到透视变换。透视变换(Perspective Transformation),又称投影映射(Projective Mapping)、投射变换等,是三维空间上的非线性变换,可看作是仿射变换的更一般形式,简单讲即通过一个3x3的变换矩阵将原图投影到一个新的视平面(Viewing Plane),在视觉上的直观表现就是产生或消除了远近感。落实到OpenCV,图像的透视变换由以下函数完成(该函数是针对图像的包装,其本质调用cv.perspectiveTransform()  进行向量坐标的变换)。

1. 透视变换测试:

1)梯形矫正

2)任意形状矫正

2. 两个关键函数:

1)cv2.findHomography(src[] , dst[])

        返回一个 3 × 3 的变换矩阵。其中, src[] 是原图片的顶点坐标,dst[] 是处理后图片的顶点坐标);

2)dstD = cv2.warpPerspective(imD, H, ( dstD.shape[1] , dstD.shape[0] ) ) 

        得到矫正后的图片。其中,imD 是原始图片,H 是变换矩阵, dstD.shape[1] 和 dstD.shape[0] 是输出图片的宽和高。

3. 问题

        原始图片顶点和输出图片的顶点是手动指定的,不能自动识别。

4. 目的

        得到变换所需要的原始图片中的四个顶点的坐标。

5. 提出想法

1)用凸包多边形拟合为外接四边形,然后求四边形的顶点;

2)角点检测,筛选最上(下、左、右)的顶点作为变换的顶点;

3)霍夫线检测求交点:检测图片文本的边界直线,求到交点作为变换的顶点。

二、将文本区域轮廓拟合为四边形

1. 思路

1)二值化图像;

2)边缘检测;

3)筛选轮廓;

4)轮廓拟合。

2. 测试一

1)边缘检测:

2)轮廓收集:

3)轮廓绘制: 

4)轮廓拟合:

3. 测试二

1)边缘检测:

2) 轮廓收集:

3) 轮廓绘制:

4) 轮廓拟合:

4. 问题:

1)拟合四边形不成功;

2)边界不明显和边界不完整对效果影响较大。

三、角点检测

        角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。角点检测(Corner Detection)是计算机视觉系统中获取图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维重建和目标识别等,也可称为特征点检测。

1. 角点检测算法的基本思想

        使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。

        目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。
 

2. 关于角点的具体描述可以有几种:

1)一阶导数(即灰度的梯度)的局部最大所对应的像素点;

2)两条及两条以上边缘的交点;

3)图像中梯度值和梯度方向的变化速率都很高的点; 

4)角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。                                                                                     

3. 角点检测算法:

1)基于二值图像的角点检测;

2)基于轮廓曲线的角点检测;

3)基于灰度图像的角点检测:基于梯度、基于模板和基于模板和梯度组合三类方法;常见的基于模板的角点检测算法有:Kitchen-Rosenfeld角点检测算法,Harris角点检测算法,KLT角点检测算法及SUSAN角点检测算法。基于模板的方法主要是考虑像素领域点灰度的变化,即亮度的变化。

4. API:

cornerHarris( InputArray src,                //输入8bit单通道灰度Mat矩阵
		      OutputArray dst,               //用于保存Harris角点检测结果,32位单通道,大小与src相同
	      	  int blockSize,                 //滑块窗口的尺寸,一般取 2
			  int ksize,                     //Sobel边缘检测滤波器大小,一般取 3
			  double k,                      //Harris中间参数,一般取 0.04~0.06
			  int borderType=BORDER_DEFAULT  //插值类型
			 );

5. 测试:

1)有完整边界

2)边界不完整

 

6. 问题:

1)角点检测的精度不高,尤其是边界不明显的时候;

2)边界不完整的时候,角点检测结果无法满足图片矫正的需求。

四、总结

        基于顶点矫正的思路对于原始图片的边界有较高的要求(完整且清晰)。

        上面测试的两张图片在有边界(虽然边界不完美)的情况下不能矫正图片,并且还要考虑以下类型图片,可能要改变一下思路。

### 回答1: OpenCV是一个开源的计算机视觉库,可以用来进行图像处理和视频分析。 在OpenCV中,可以使用仿射变换来矫正图像。 仿射变换是指将图像进行平移、旋转、缩放等操作,使得图像看起来更整齐、更对称。 使用OpenCV进行图像矫正的具体步骤如下: 1. 加载图像。使用OpenCV的imread函数可以从文件中读取图像。 2. 获取图像的矩形轮廓。使用OpenCV的findContours函数可以找到图像中的矩形轮廓。 3. 计算仿射变换矩阵。使用OpenCV的getAffineTransform函数可以计算出仿射变换矩阵。 4. 应用仿射变换。使用OpenCV的warpAffine函数可以将图像进行仿射变换。 5. 保存矫正后的图像。使用OpenCV的imwrite函数可以将矫正后的图像保存到文件中。 示例代码如下: ``` #include <opencv2/opencv.hpp> using namespace cv; int main() { // 加载图像 Mat src = imread("image.jpg"); // 获取图像的矩形轮廓 vector<vector<Point>> contours; findContours(src, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 计算仿射变换矩阵 Mat transform = getAffineTransform(contours[0], contours[1]); // 应用仿射变换 Mat dst; warpAffine(src, dst, transform, src.size()); // 保存 ### 回答2: OpenCV是一个利用计算机视觉技术进行图像处理和分析的开源库。图片矫正是指对图像进行旋转和平移等操作,使得图像恢复到正确的位置和姿态。在OpenCV中,可以通过以下步骤来进行图像矫正。 首先,需要确定矫正所需的参考点或标志物。这可以是任何可以在图像中找到并计算其位置和角度的特征点。例如,可以使用棋盘格、直线、角点等。 然后,可以使用OpenCV中的相机标定功能来计算相机的内部参数和畸变系数。这些参数将帮助我们精确地矫正图像。 接下来,可以使用findHomography等函数来计算变换矩阵。变换矩阵可以将图像中的点映射到参考图像中的对应点。 在计算得到变换矩阵后,可以使用warpPerspective函数来将图像进行透视变换。这将根据变换矩阵来调整图像的位置和姿态。 最后,可以对图像进行旋转、平移等操作,使其恢复到正确的位置和姿态。 需要注意的是,图像矫正是一个复杂的过程,其结果受到很多因素的影响,例如图像质量、特征点的准确性以及相机标定的精度等。因此,在进行图像矫正时,需要仔细选择参考点和进行参数调整,以确保结果的准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值