指的是把原图像初始的坐标(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;
}
初始图像:
平移后的图像
平移后的图像比初始化图像的宽、高相应的增加了(y,x)(代码中),如上图所示,
平移后的图像的左边、上边会有一部分是空白的,此空白的尺寸就是平移的尺寸。
#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;
}
效果如下图所示:
#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;
}
参考别人的代码 :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