前言
图像的几何变换是指在不改变图像像素值的前提下对图像像素进行空间几何变换,常见的几何变换有距离变换、坐标映射、平移、镜像、旋转、缩放、仿射交换等等。图像的几何变换是图像处理和分析的基础,应用广泛。
图像平移
图像的平移操作是将图像的所有像素坐标进行水平或垂直方向移动,也就是将所有像素点按照给定的偏移量在水平方向沿 x 轴、垂直方向上沿 y 轴移动。平移变换分为两种类型:图像大小变化与图像大小不变。第一种类型保证图像平移的完整信息,第二种图像导致原始图像的部分信息可能丢失。
平移原理
我们对图像进行逐像素操作,遍历需要平移的图像,将需要平移的图像的每个像素点进行操作,存储在返回图像中,实现平移操作。
代码演示
图像平移,图像大小不变
在这里,我们设置返回图像的大小,遍历需要平移的图像的每个像素点,存储在返回图像中,最后进行返回操作。
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//平移操作,图像大小不变
Mat imgTranslation1(Mat& src, int xOffset, int yOffset)
{
int nRows = src.rows;
int nCols = src.cols;
Mat result(src.size(), src.type());
//遍历图像
for (int i = 0; i < nRows; ++i)
{
for (int j = 0; j < nCols; ++j)
{
int x = j - xOffset;
int y = i - yOffset;
if (x >= 0 && y >= 0 && x < nCols && y < nRows)
{
result.at<Vec3b>(i, j) = src.ptr<Vec3b>(y)[x];
}
}
}
return result;
}
int main()
{
Mat src = imread("C://Users//86173//Desktop//cc.png");
if (!src.data)
return -1;
imshow("src", src);
int xOffset = 50, yOffset = 80;
//图像左平移不改变大小
Mat dst1 = imgTranslation1(src, xOffset, yOffset);
imshow("dst1", dst1);
waitKey(0);
return 0;
}
图像平移,图像大小改变
在这里我们需要改变图像的大小,因此在初始化返回图像时要进行注意设置平移尺寸。
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//平移操作,图像大小改变
Mat imgTranslation2(Mat& src, int xOffset, int yOffset)
{
//设置平移尺寸
int nRows = src.rows + abs(yOffset);
int nCols = src.cols + abs(xOffset);
Mat result(nRows, nCols, src.type());
//遍历图像
for (int i = 0; i < nRows; ++i)
{
for (int j = 0; j < nCols; ++j)
{
//映射变换
int x = j - xOffset;
int y = i - yOffset;
if (x >= 0 && y >= 0 && x < nCols && y < nRows)
{
result.at<Vec3b>(i, j) = src.ptr<Vec3b>(y)[x];
}
}
}
return result;
}
int main()
{
Mat src = imread("C://Users//86173//Desktop//cc.png");
if (!src.data)
return -1;
imshow("src", src);
int xOffset = 50, yOffset = 80;
//图像左平移改变大小
Mat dst1 = imgTranslation2(src, xOffset, yOffset);
imshow("dst1", dst1);
waitKey(0);
return 0;
}
其他: