拉伸、收缩、扭曲和旋转
最简单的图像变换是调整图像大小,使其变大或变小。但实际操作时要比想象的复杂一些,因为调整大小带来了像素如何插值(放大)或合并(减少)的问题。
均匀调整
cv::resize()
void cv::resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=cv::INTER_LINEAR)
作用:根据设置调整图像为指定大小,其中有两种指定方式:① 绝对尺寸:通过dsize直接设置;② 相对尺寸:dsize设置为cv::Size(0,0),然后将fx和fy设置为我们想要的比例因子即可。
插值 | 含义 |
---|---|
cv::INTER_LINEAR | 双线性插值法 |
cv::INTER_NEAREST | 最近邻插值 |
cv::INTER_AREA | 像素区域重采样 |
cv::INTER_CUBIC | 双三次插值 |
cv::INTER_LANCZ0S4 | 插值(超过8×8个邻域) |
#include "stdafx.h"
#include <opencv2/opencv.hpp>
int main()
{
cv::namedWindow("image", cv::WINDOW_NORMAL);
cv::namedWindow("nearest", cv::WINDOW_NORMAL);
cv::namedWindow("linear", cv::WINDOW_NORMAL);
cv::namedWindow("area", cv::WINDOW_NORMAL);
cv::namedWindow("cubic", cv::WINDOW_NORMAL);
cv::namedWindow("lancz0s4", cv::WINDOW_NORMAL);
cv::Mat image = cv::imread("D:\\personal-data\\wallpapers\\cat.jpg");
cv::Mat nearest, linear, area, cubic, lancz0s4;
cv::resize(image, nearest, cv::Size(0, 0), 2, 2);
cv::resize(image, linear, cv::Size(0, 0), 2, 2);
cv::resize(image, area, cv::Size(0, 0), 2, 2);
cv::resize(image, cubic, cv::Size(0, 0), 2, 2);
cv::resize(image, lancz0s4, cv::Size(0, 0), 2, 2);
cv::imshow("image", image);
cv::imshow("nearest", nearest);
cv::imshow("linear", linear);
cv::imshow("area", area);
cv::imshow("cubic", cubic);
cv::imshow("lancz0s4", lancz0s4);
cv::waitKey(0);
cv::destroyAllWindows();
return 0;
}
图像金字塔
关于图像金字塔,在之前的学习过程中已经详细介绍过,详细可以点击链接:OpenCV图像金字塔。
其中详细介绍了其原理,以及生成金字塔的过程。在这里将补充一个自动生成高斯金字塔的方法:
void cv::buildPyramid(InputArray src, OutputArrayOfArrays dst, int maxlevel)
不均匀映射
可以拉伸、收缩、扭曲或转换图像的功能称为几何变换。对于平面区域,有两种几何变换:使用2×3矩阵的变换称为“仿射变换”;使用3×3矩阵的变换称为“透视变换”或“同形”。
仿射变换
仿射变换是可以以矩阵乘法后跟向量加法的形式表示的任何变换。在OpenCV中,该变换的标准样式是2×3矩阵。定义如下:
仿射变换可以将矩形转换为平行四边形,它们可以挤压形状,但是必须保持对边平行,可以旋转或缩放。
密集仿射变换函数cv::warpAffine()
void cv::warpAffine(InputArray src, OutputArray dst, InputArray M, cv::Size dsize, int flags=cv::INTER_LINEAR, int borderMode=cv::BORDER_CONSTANT, const cv::Scalar& borderValue=cv::Scalar())
作用:对输入矩阵做仿射变换,为了输出图像平滑而自然,需要处理内插。M为前面提到的2×3的矩阵;dsize是目标图像尺寸;flags是插值方法,和resize()方法里的插值方法相同,这里有个附加个cv::WARP_INVERSE_M