对图像的仿射变换

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

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

在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来按顺序存放

原文地址:https://www.cnblogs.com/zzatp/p/9139173.html

时间: 2024-11-05 01:01:46

对图像的仿射变换的相关文章

图像的仿射变换与AffineTransform类

在图像匹配研究领域中,仿射变换图像是一个重要的研究对象,因此需要对仿射变换在图像中的操作有基本认识.学习了网上一些博客和教程,简单记录了一下: 图像的仿射变换主要包含以下一系列操作:翻转(Flip).旋转(Rotation).平移(Translation).缩放(Scale)和错切(Shear). AffineTransform类描述了一种二维仿射变换的功能,它是一种二维坐标到二维坐标之间的线性变换,保持二维图形的"平直性"(straightness)即变换后直线依然保持直线,圆弧还是

第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)

拉伸.收缩.扭曲.旋转是图像的几何变换,在三维视觉技术中大量应用到这些变换,又分为仿射变换和透视变换.仿射变换通常用单应性建模,利用cvWarpAffine解决密集映射,用cvTransform解决稀疏映射.仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化.透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形.当然,平行四边形也是梯形,所以仿射变换是透视变换的子集. 本小节实现图像的仿射变换. -----------------

图像仿射变换/旋转

import cv2import numpy as npimg = cv2.imread('../img/zidan.jpg',1)imgInfo = img.shapeheight = imgInfo[0]width = imgInfo[1]matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])#输入图像对应的三角形的顶点坐标matDst = np.float32([[50,50],[100,height-50],[width-200,100

OpenCV仿射变换+投射变换+单应性矩阵

本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变. getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6. warpAffine():对输入图像进行仿射

【OpenCV新手教程之十八】OpenCV仿射变换 &amp;amp; SURF特征点描写叙述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本号: 2.4.9 本篇文章中.我们一起探讨了OpenCV

第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)

透视变换(单应性?)能提供更大的灵活性,但是一个透视投影并不是线性变换,因此所采用的映射矩阵是3*3,且控点变为4个,其他方面与仿射变换完全类似,下面的例程是针对密集变换,稀疏图像变换则采用cvPerspectiveTransform函数来处理. ------------------------------------------------------------------------------------------------ WarpPerspective 对图像进行透视变换 voi

【OpenCV入门教程之十八】OpenCV仿射变换 &amp; SURF特征点描述合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们一起探讨了OpenCV中

OpenCV探索之路(八):重映射与仿射变换

重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在OpenCV中,用的是remap函数实现重映射. 基本重映射 #include <iostream> #include <opencv2\opencv.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\

[opencv] 图像几何变换:旋转,缩放,斜切

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