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

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

实验目的

 理解图像旋转所需的 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);
}

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值