实验五 图像几何变换-图像旋转

实验五 图像几何变换-图像旋转

实验目的

 理解图像旋转所需的 2 个步骤;
 编程实现图像的旋转;
 总结实验过程。

实验要求

  1. 编写图像旋转程序:
     编程对图像进行逆时针 30°的旋转,可采用正变换、也可以采用逆变换,用最邻近像元法
    和双线性插值法进行灰度赋值;
  2. 观察图像旋转处理结果
     利用 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);
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

发布了10 篇原创文章 · 获赞 8 · 访问量 1605

猜你喜欢

转载自blog.csdn.net/Canvaskan/article/details/102655472
今日推荐