对图像的仿射变换

Posted zzatp

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对图像的仿射变换相关的知识,希望对你有一定的参考价值。

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间

线性变换包含了平移,缩放,旋转,镜像,斜切,正交投影,线性变换在几何上可能造成拉伸但是不会直线不会出现弯折。

在OpenCV里仿射变换通过一个2x3的矩阵来表示,前面两列表示旋转、缩放、斜切、镜像等,后面两列表示x,y方向平移

下面我们来通过仿射变换来实现图像的平移、缩放、旋转

平移:(向X轴方向平移100像素)

只平移的话,前面两列单位矩阵,后面一列数据(100,0)

 

 缩放:(x轴缩放0.3,y轴缩放0.5)

旋转:(顺时针旋转30度)

 

 代码如下:

// wrapaffine.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "opencv2/opencv.hpp"

// 显示平移
void showTranslate(cv::Mat&inputImage) {
	cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 0);
	cv::Mat destImg;
	cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT);
	cv::imshow("translate", destImg);
}
void showScale(cv::Mat&inputImage) {
	cv::Mat mat1 = (cv::Mat_<double>(2, 3) << 0.3, 0, 0, 0, 0.5, 0);
	cv::Mat destImg;
	cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT);
	cv::imshow("scale", destImg);
}
void showRotate(cv::Mat&inputImage) {

	float g3 = sqrt(3.0);// 根号3

	cv::Mat mat1 = (cv::Mat_<double>(2, 3) << g3/2.0, -1.0/2.0, 0, 1.0 / 2.0, g3 / 2.0, 0);
	cv::Mat destImg;
	cv::warpAffine(inputImage, destImg, mat1, cv::Size(inputImage.cols, inputImage.rows), cv::INTER_LINEAR, cv::BORDER_CONSTANT);
	cv::imshow("rotate", destImg);
}
int main()
{
	cv::Mat inputImage = cv::imread("test.png");
	cv::imshow("src", inputImage);

	 showTranslate(inputImage);
	 showScale(inputImage);
	showRotate(inputImage);
	cv::waitKey();
	cv::destroyAllWindows();
    return 0;
}

  注:OpenCV的cv::Mat是按行的顺序存储数据,意思就是这样一个缩放矩阵他的数据从上面一行0.3,0,0开始存储到第二行0,0.5,0来按顺序存放

以上是关于对图像的仿射变换的主要内容,如果未能解决你的问题,请参考以下文章

Halcon 学习笔记3 仿射变换

一文搞懂仿射变换

图像处理之_仿射变换与透视变换

OpenCV图像变换(仿射变换与透视变换)

OpenCV 完整例程24. 图像的仿射变换

图像处理各种变换运算算法的简明原理作用和应用场合