OpenCV图像翻转和图像Resize

OpenCV图像翻转和图像Resize

1.图像翻转

图像翻转的本质就是像素值得映射,OpenCV提供了API flip来翻转图像,有三种翻转方式:

void flip(InputArray src, //输入
		  OutputArray dst, //输出
	      int flipCode);//旋转方式 

代码实践:

	Mat result_x, result_y, result_xy;

	//沿x轴翻转
	flip(input_image, result_x, 0);
	imshow("result_x", result_x);

	//沿y轴翻转
	flip(input_image, result_y, 1);
	imshow("result_y", result_y);

	//沿xy对角线翻转
	flip(input_image, result_xy, -1);
	imshow("result_xy", result_xy);

结果:
OpenCV图像翻转和图像Resize

2.图像Resize

图像插值是从图像低分辨率图像生成高分辨率图像的过程中插值以恢复图像中所丢失的信息,即补全图像放缩所丢失的信息。
常见的四种插值方法:

  • 近邻插值:INTER_NEAREST
  • 线性插值:INTER_LINEAR
  • 立方插值:INTER_CUBIC
  • 卢卡斯插值:INTER_LANCZOS

OpenCV提供了resize():

void resize( InputArray src, OutputArray dst,
             Size dsize, double fx = 0, double fy = 0,
             int interpolation = INTER_LINEAR );

代码实践:

	int height = input_image.rows;
	int width = input_image.cols;
	float fx = 0.0, fy = 0.0;

	Mat result = Mat::zeros(input_image.size(), input_image.type());

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_NEAREST);
	imshow("INTER_NEAREST", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_LINEAR);
	imshow("INTER_LINEAR", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_CUBIC);
	imshow("INTER_CUBIC", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_LANCZOS4);
	imshow("INTER_LANCZOS4", result);

3.完整代码

#include<opencv2/opencv.hpp>
#include<iostream>
//#include<Windows.h>

using namespace cv;
using namespace std;

int main(int argc, char**argv)
{
	//get input image
	Mat input_image = imread("./whisper.jpg", 1);
	if (input_image.empty())
	{
		cout << "read input error!" << endl;
		return -1;
	}
	imshow("input", input_image);
#if 0
	Mat result_x, result_y, result_xy;

	//沿x轴翻转
	flip(input_image, result_x, 0);
	imshow("result_x", result_x);

	//沿y轴翻转
	flip(input_image, result_y, 1);
	imshow("result_y", result_y);

	//沿xy对角线翻转
	flip(input_image, result_xy, -1);
	imshow("result_xy", result_xy);
#endif

	int height = input_image.rows;
	int width = input_image.cols;
	float fx = 0.0, fy = 0.0;

	Mat result = Mat::zeros(input_image.size(), input_image.type());

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_NEAREST);
	imshow("INTER_NEAREST", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_LINEAR);
	imshow("INTER_LINEAR", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_CUBIC);
	imshow("INTER_CUBIC", result);

	resize(input_image, result, Size(width * 2, height * 2), fx = 0, fy = 0, INTER_LANCZOS4);
	imshow("INTER_LANCZOS4", result);


	waitKey(0);
	destroyAllWindows();
	//system("pause");
	return 0;
}