一、图像的镜像变换
1.1 镜像变换理论
图像的镜像变换分为水平镜像和垂直镜像。分别以yy轴和xx轴为对称轴。
水平镜像的变换公式:
其中,ww是图像的水平分辨率。
垂直镜像的变换公式:
其中,ww是图像的垂直分辨率。
1.2 主代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
// 函数声明 水平镜像和垂直镜像
void ImgMirrorY(Mat& inputImag_1, Mat& outputImage);
void ImgMirrorX(Mat& inputImag_1, Mat& outputImage);
int main()
{
// 载入图像并显示
Mat originImage_boy = imread("lena.png", 1);
imshow("original_boy", originImage_boy);
// 创建效果图
Mat resultImage;
resultImage.create(originImage_boy.rows, originImage_boy.cols, originImage_boy.type());
// 记录时间
double timeClock = static_cast<double>(getTickCount());
// 函数调用
// 可定义和调用不同的函数
ImgMirrorY(originImage_boy, resultImage);
// 输出时间
timeClock = ((double)getTickCount() - timeClock) / getTickCount();
cout << "run time:" << timeClock << "seconds" << endl;
imshow("result_Move",resultImage);
waitKey(0);
return 0;
}
1.3 水平镜像函数-OpenCV
// 水平镜像函数定义
// 使用动态地址计算图像
void ImgMirrorY(Mat& inputImag_1, Mat& outputImag)
{
int rowsNum = outputImag.rows;
int colsNum = outputImag.cols;
outputImag = inputImag_1.clone();
for (int i = 0; i < rowsNum; i++)
{
for (int j = 0; j < colsNum; j++)
{
outputImag.at<Vec3b>(i, j)[0] = inputImag_1.at<Vec3b>(i, colsNum - 1 - j)[0];
outputImag.at<Vec3b>(i, j)[1] = inputImag_1.at<Vec3b>(i, colsNum - 1 - j)[1];
outputImag.at<Vec3b>(i, j)[2] = inputImag_1.at<Vec3b>(i, colsNum - 1 - j)[2];
}
}
}
1.4 水平镜像结果图
1.5 垂直镜像函数-OpenCV
// 垂直镜像函数定义
// 使用动态地址计算图像
void ImgMirrorX(Mat& inputImag_1, Mat& outputImag)
{
int rowsNum = outputImag.rows;
int colsNum = outputImag.cols;
outputImag = inputImag_1.clone();
for (int i = 0; i < rowsNum; i++){
for (int j = 0; j < colsNum; j++){
outputImag.at<Vec3b>(i, j)[0] = inputImag_1.at<Vec3b>(rowsNum - 1 - i, j)[0];
outputImag.at<Vec3b>(i, j)[1] = inputImag_1.at<Vec3b>(rowsNum - 1 - i, j)[1];
outputImag.at<Vec3b>(i, j)[2] = inputImag_1.at<Vec3b>(rowsNum - 1 - i, j)[2];
}
}
}
1.6 垂直镜像结果图