图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)

1、图像平移:

指的是把原图像初始的坐标(0,0)增加(dx;dy)像素,变成新的图像(初始坐标为(dx;dy))。也就是将原先图像的横坐标和纵坐标分别加上一个数字,变成一个新的坐标,然后将原图中原坐标位置的RGB赋值给新图中新坐标。

#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image;
	image = imread("t2.jpg", CV_LOAD_IMAGE_COLOR);

	if (!image.data)
	{
		cout << "图片无法显示!" << endl;
		return -1;
	}
	//namedWindow("初始图像", CV_WINDOW_AUTOSIZE);
	imshow("初始", image);

	int x = 50, y = 40;
	Mat image_(image.rows + x, image.cols + y, CV_8UC3);

	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
            // Vec3b 一个uchar类型的,长度为3的vector向量。
            // 对于RGB三通道的图像,每个点的数据都是一个Vec3b类型的数据。
			image_.at(i + x, j + y)[0] = image.at(i, j)[0]; 
			image_.at(i + x, j + y)[1] = image.at(i, j)[1];
			image_.at(i + x, j + y)[2] = image.at(i, j)[2];
		}
	}

	imshow("目前", image_);
	imwrite("t2_.jpg", image_); // 把平移后的图像存储在t2_.jpg的文件中。
	waitKey(0);

	destroyAllWindows();
	image.release();
	image_.release();
	return 0;
}

 运行程序后得到的图像如下所示:

初始图像:

 

图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)_第1张图片 初始化图像(此图从网上下载,下右下角有相关下载的网址)

 

平移后的图像

图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)_第2张图片 平移后的图像

注释:  

平移后的图像比初始化图像的宽、高相应的增加了(y,x)(代码中),如上图所示,

平移后的图像的左边、上边会有一部分是空白的,此空白的尺寸就是平移的尺寸。

 

 2、图像缩小、扩大:

#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image;
	image = imread("t2.jpg", CV_LOAD_IMAGE_COLOR);

	if (!image.data)
	{
		cout << "图片无法显示!" << endl;
		return -1;
	}
	
	imshow("初始", image);

	double nul = 0.5;
	int x = (int)floor(image.rows*nul), y = (int)floor(image.cols*nul);
	
	double nul2 = 1.2;
	int x1 = (int)floor(image.rows*nul2), y1 = (int)floor(image.cols*nul2);

	Mat image_(x, y, CV_8UC3);
	Mat image_1(x1, y1, CV_8UC3);

	// 图像缩小一半,
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{			
			int a = (int)1.0 / nul * i, b = (int)1.0 / nul * j;
			image_.at(i, j)[0] = image.at(a, b)[0];
			image_.at(i, j)[1] = image.at(a, b)[1];
			image_.at(i, j)[2] = image.at(a, b)[2];
		}
	}

	// 图像扩大一倍,
	for (int i = 0; i < x1; i++)
	{
		for (int j = 0; j < y1; j++)
		{
			int a1 = (int)1.0 / nul2 * i, b1 = (int)1.0 / nul2 * j;
			image_1.at(i, j)[0] = image.at(a1, b1)[0];
			image_1.at(i, j)[1] = image.at(a1, b1)[1];
			image_1.at(i, j)[2] = image.at(a1, b1)[2];
		}
	}


	imshow("缩放", image_);
	imwrite("t2_2.jpg", image_); 

	imshow("扩大", image_1);
	imwrite("t2_3.jpg", image_1);
	waitKey(0);

	destroyAllWindows();
	image.release();
	image_.release();
	image_1.release();
	return 0;
}

效果如下图所示:

图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)_第3张图片 图像缩小0.5倍(原图从图上右下角下载)
图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)_第4张图片 图像扩大1.2倍(原图从图上右下角下载

3、图像旋转:输出图像如下图所示。

#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image;
	image = imread("t2.jpg", CV_LOAD_IMAGE_COLOR);
	
	if (!image.data)
	{
		cout << "图片无法显示!" << endl;
		return -1;
	}
		
	imshow("初始", image);
	
	double angle = 135.0 * 3.1415926 / 180.0;//把角度化成弧度
	int dis = ceil(sqrt(pow(image.rows, 2) + pow(image.cols, 2)));//新图像的长宽应该是原图像的对角线长度
	Mat image_n(dis, dis, CV_8UC3);
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			//平移的大小,
			float x = image_n.rows / 2 - ((image.rows / 2)*cos(angle) - (image.cols / 2)*sin(angle)),
				y = image_n.cols / 2 - ((image.rows / 2)*sin(angle) + (image.cols / 2)*cos(angle));

			int x1 = i * cos(angle) - j * sin(angle) + x,
				y1 = i * sin(angle) + j * cos(angle) + y;
			image_n.at(x1, y1)[0] = image.at(i, j)[0];
			image_n.at(x1, y1)[1] = image.at(i, j)[1];
			image_n.at(x1, y1)[2] = image.at(i, j)[2];
		}
	}

	imshow("旋转", image_n);
	waitKey(0);
	
	destroyAllWindows();
	image.release();
	image_n.release();

	return 0;
}

图像处理的方法平移、缩放、扩大(VS2017+Opencv3.4.6)_第5张图片

参考别人的代码 https://blog.csdn.net/C2681595858/article/details/82824282?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-8-82824282.nonecase

你可能感兴趣的:(OpenCv学习,基础学习C++)