OpenCV之图像几何变换

图像的几何变化主要包括平移、旋转、缩放等。这里主要介绍使用remap()函数来实现上述过程。实际上图像的缩放用resize()函数实现更好,因为remap()意义是将一幅图像映射到另一幅图像,映射关系可以自由设定,但要求两幅图像的尺寸、类型相同,而resize()可以设定输出图像的尺寸。
remap()函数原型:
void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode =BORDER_CONSTANT,
const Scalar& borderValue = Scalar())
第一个参数:输入图像,即原图像,Mat类对象即可。需要单通道8位或者浮点类型的图像;
第二个参数:输出图像,即目标图像,需和原图形一样的尺寸和类型;
第三个参数:它有两种可能表示的对象:
(1)表示点(x,y)的第一个映射;
(2)表示CV_16SC2,CV_32FC1等类型的尺寸和输入图像一样的Mat对象,其值为映射后的X值
第四个参数:它有两种可能表示的对象:
(1)若map1表示点(x,y)时,这个参数不代表任何值;
(2)表示CV_16SC2,CV_32FC1等类型的尺寸和输入图像一样的Mat对象,其值为映射后的Y值;
第五个参数:插值方式,有四中插值方式:
(1)INTER_NEAREST——最近邻插值
(2)INTER_LINEAR——双线性插值(默认)
(3)INTER_CUBIC——双三样条插值(默认)
(4)INTER_LANCZOS4——lanczos插值(默认)
第六个参数:边界模式,默认BORDER_CONSTANT;
第七个参数:边界颜色,默认Scalar()黑色。
调用方法如下:

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
	Mat srcImage = imread("D:\\visual studio 2010\\Projects\\remap\\1.jpg");
	Mat dstImage,map_x,map_y;
	imshow("",srcImage);
	//创建和原始图像一样的效果图,x重映射图,y重映射图
	dstImage.create(srcImage.size(),srcImage.type());
	map_x.create(srcImage.size(),CV_32FC1);
	map_y.create(srcImage.size(),CV_32FC1);
	//双层循环,遍历每一个像素点,改变map_x和map_y的值
	for(int j=0;j<srcImage.rows;j++)
	{
		for(int i=0;i<srcImage.cols ;i++)
		{
			//改变map_x和map_y的值
			map_x.at<float>(j,i) = static_cast<float>(srcImage.rows -i);
			map_y.at<float>(j,i) = static_cast<float>( srcImage.rows-j);
		}
	}
	//进行重映射操作
	remap(srcImage,dstImage,map_x,map_y);
    //显示效果图
	imshow("效果图",dstImage);
	waitKey(0);
	return 0;
}

这段程序将srcImage绕中心旋转180°保存在dstImage中,双重循环在设置map_x,map_y的值,其中map_x(i,j)和map_y(i,j)的值表示将srcImage中第i行j列出的像素点映射到dstImage中第map_y(i,j)行map_x(i,j)列处,所以上述代码实现了图像上下左右颠倒。
更改循环中map_x和map_y的映射方式,便可以实现平移、旋转等,还可以实现其他方式的变化。
附:
绕左上角顺时针旋转β代码

for(int j=0;j<srcImage.rows;j++)
	{
		for(int i=0;i<srcImage.cols ;i++)
		{
			//改变map_x和map_y的值 绕左上角顺时针旋转β代码
			map_x.at<float>(j,i) = (float)(i)*cos(β)-(float)(j)*sin(β);
			map_y.at<float>(j,i) = (float)(i)*sin(β)+(float)(j)*cos(β);
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值