几何变换
几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。
几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定为整数坐标。这时就需要灰度级差值将映射的新坐标匹配到输出像素之间。最简单的插值方法是最近邻插值,就是令输出像素的灰度值等于映射最近的位置像素,该方法可能会产生锯齿。这种方法也叫零阶插值,相应比较复杂的还有一阶和高阶插值。
插值算法感觉只要了解就可以了,图像处理中比较需要理解的还是空间变换。
空间变换
空间变换对应矩阵的仿射变换。一个坐标通过函数变换的新的坐标位置:

所以在程序中我们可以使用一个2*3的数组结构来存储变换矩阵:

以最简单的平移变换为例,平移(b1,b2)坐标可以表示为:

因此,平移变换的变换矩阵及逆矩阵记为:

缩放变换:将图像横坐标放大(或缩小)sx倍,纵坐标放大(或缩小)sy倍,变换矩阵及逆矩阵为:

选择变换:图像绕原点逆时针旋转a角,其变换矩阵及逆矩阵(顺时针选择)为:

OpenCV中的图像变换函数
基本的放射变换函数:
void cvWarpAffine(
const CvArr* src,//输入图像
CvArr* dst, //输出图像
const CvMat* map_matrix, //2*3的变换矩阵
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, //插值方法的组合
CvScalar fillval=cvScalarAll(0) //用来填充边界外的值
);另外一个比较类似的函数是cvGetQuadrangleSubPix:
void cvGetQuadrangleSubPix(
const CvArr* src, //输入图像
CvArr* dst, // 提取的四边形
const CvMat* map_matrix //

本文介绍了OpenCV中的图像几何变换,包括旋转、缩放和斜切。通过空间变换矩阵阐述了平移、缩放和旋转的原理,并详细讲解了OpenCV中的图像变换函数cvWarpAffine与cvGetQuadrangleSubPix的差异。提供了多个实践示例,如图像旋转变换(原尺寸和放大尺寸)以及放射变换(通过三点确定变换矩阵)。附带实验代码下载链接。
最低0.47元/天 解锁文章
2528

被折叠的 条评论
为什么被折叠?



