实验五 图像几何变换-图像旋转
实验目的
理解图像旋转所需的 2 个步骤;
编程实现图像的旋转;
总结实验过程。
实验要求
- 编写图像旋转程序:
编程对图像进行逆时针 30°的旋转,可采用正变换、也可以采用逆变换,用最邻近像元法
和双线性插值法进行灰度赋值; - 观察图像旋转处理结果
利用 Photoshop 对图像进行旋转处理。
分析对比 Photoshop 和自己编写的图像旋转程序处理效果不同之处,并设法改经自己的图
像处理程序。
代码及结果
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <Windows.h>
using namespace std;
using namespace cv;
//全局变量
Mat src = imread("taiji.jpg", 1);
Mat dst;
const int slider_max = 360;
int slider = 0;
//提前声明
void RotateAnyAngle(Mat& input, Mat& output);
void onTrackbar(int pos, void*);
void AutoRotate();
int main()
{
namedWindow("源图像", WINDOW_AUTOSIZE);
namedWindow("旋转结果", WINDOW_AUTOSIZE);
createTrackbar("Angle:", "旋转结果", &slider, slider_max, onTrackbar);
waitKey(1000);
imshow("源图像", src);
waitKey(0);
return 0;
}
void RotateAnyAngle(Mat& input, Mat& output)
{
double angle = slider;//正值为逆时针
double scale = 1;//缩放比例
int min_length = min(input.rows, input.cols);
int border = ceil(sqrt(input.rows*input.rows / 4 + input.cols*input.cols / 4) - min_length/2);
Mat input_mb = input.clone();
copyMakeBorder(input, input_mb, border, border, border, border, BORDER_CONSTANT, Scalar(0));
Point center = Point(input_mb.cols / 2, input_mb.rows / 2);
Mat rot_mat = getRotationMatrix2D(center, angle, scale);
Mat dst_rot(input_mb.cols, input_mb.rows, input_mb.type());
warpAffine(input_mb, dst_rot, rot_mat, dst_rot.size(), INTER_LINEAR, BORDER_CONSTANT, Scalar(0));
output = dst_rot.clone();
}
void onTrackbar(int pos,void*)
{
if (pos <= 0)
{
RotateAnyAngle(src, dst);
}
RotateAnyAngle(src, dst);
imshow("旋转结果", dst);
}