图像的平移和缩放

        图像的平移比较简单,不多说。图像的缩放有多种方法,在此采用双线性插值方法,至于具体的算法原理,维基上讲的很好,主要是配图比较明了,网上的其他地方也有很多类似的文章以作参考,我在学习这个算法时在网上也查找了一些这方面的资料,发现比较多的是讲理论,上代码的不多,当然理论很重要啦,本文希望改善这一状况,本文结合C++和OpenCV来实现这些功能。


1、图像平移不改变图像宽高

Mat TranslationInvarianceImWH(Mat Image, int OffsetX, int OffsetY)
{
	int m = Image.rows;
	int n = Image.cols;
	Mat ResultImage(m, n, Image.type());
	for (int i = 0; i < m; i++)
	{
		int y = (i + OffsetY);
		for (int j = 0; j < n; j++)
		{
			int x = (j + OffsetX);
			if (y< m && x< n)
			{
				//ResultImage.at<Vec3b>(y, x) = Image.ptr<Vec3b>(i)[j];
				ResultImage.ptr<Vec3b>(y)[x] = Image.ptr<Vec3b>(i)[j];
			}

		}
	}
	return ResultImage;
}

2、图像平移改变宽高

Mat TranslationChangeImWH(Mat Image,int OffsetX, int OffsetY)
{
	int m = Image.rows;
	int n = Image.cols;
	int m1=m + abs(OffsetY);
	int n1=n + abs(OffsetX);
	Mat ResultImage(m1,n1,Image.type());
	for (int i = 0; i < m; i++)
	{
		int y = (i + OffsetY);
		for (int j = 0; j < n; j++)
		{	
			int x = (j + OffsetX);
			if ( y< m1 && x< n1)
			{
				ResultImage.at<Vec3b>(y, x) = Image.ptr<Vec3b>(i)[j];
			}
			
		}
	}
	return ResultImage;
}

3、图像缩放

Mat ResizeImage(Mat Image, float Scale)
{
	int m = Image.rows;
	int n = Image.cols;
	int m1 = floor(m*Scale);
	int n1 = floor(n*Scale);
	float ScaleY = float(m1) / float(m);
	float ScaleX = float(n1) / float(n);   
	Mat ResultImage = Mat::zeros(m1, n1, CV_32FC3);
	Image.convertTo(Image, CV_32FC3);
	for (int i = 0; i < m1; i++)
	{
		float InvY = float(i) / ScaleY;
		float Y = floor(InvY);
		float Dy = InvY - Y;
		for (int j = 0; j < n1; j++)
		{
			float InvX = float(j) / ScaleX;
			float X = floor(InvX);
			float Dx = InvX - X;
			int x = int(X);
			int y = int(Y);
			ResultImage.ptr<Vec3f>(i)[j] = (1 - Dy)*(1 - Dx)*Image.ptr<Vec3f>(y)[x]
				+ Dy*(1 - Dx)*Image.ptr<Vec3f>(y + 1)[x] + (1 - Dy)*Dx*Image.ptr<Vec3f>(y)[x + 1]
				+ Dy*Dx*Image.ptr<Vec3f>(y + 1)[x + 1];
		}
	}
	Mat ResultImage1;
	ResultImage.convertTo(ResultImage1, CV_8UC3);
	return ResultImage1;
}

主函数调用演示:

int main()
{
	int OffsetX = 100;
	int OffsetY=200;
	// 读入一张图片
	Mat Image = imread("E:\\PublicPicture\\building1.JPG",1);
	if (!Image.data)
		return -1;

	imshow("原始图像",Image);

	Mat ResultImg;
	//平移1
	ResultImg = TranslationInvarianceImWH(Image, OffsetX, OffsetY);
	imshow("变化后的图1", ResultImg);
	//平移2
	ResultImg = TranslationChangeImWH(Image, OffsetX, OffsetY);
	imshow("变化后的图2", ResultImg);
	//我的缩放,双线性插值法
	ResultImg=ResizeImage(Image, 0.5);
	imshow("变化后的图3", ResultImg);
	//resize 函数缩放
	Mat Imresize;
	resize(Image, Imresize, Size(0, 0),0.5,0.5);
	imshow("变化后的图4", Imresize);
	waitKey(0);
	return 0;
}







      注册账号很久了,但没写过一点东西,各种拖延,今天终于开了个篇,万事开头难,以后会坚持写一些在这方面的东西,和社区的人一起学习交流。

      新人新篇,如有不当处勿喷,望指正。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值