图像尺寸变换
图像插值原理
由于对图像的操作存在拉伸变换,造成变换前后图像像素点位置发生变化。
- 两个像素合并成一个像素
- 两个相邻像素中间多出位置
最邻近法
选择临近的像素。简单,效果较差
线性插值法
选择临近两个像素,建立一次函数,进行投影,得到的数据
双线性插值法
选择临近的四个像素,四个像素两两建立一次函数,再把像素投影到建立好的一次函数上再次建立一次函数得到数据。
应用图像的拉伸变换、旋转、仿射变换、透视变换等涉及到对图像像素位置改变的情况。
图像缩放,反转,拼接
缩放
resize()
void cv::resize(InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR)
- src:输入图像
- dst:输出图像
- dsize:输出图像的尺寸
- fx:水平轴的比例因子,如果将水平轴变为原来的两倍,则赋值为2
- yx:垂直轴的比例因子,如果将垂直轴变为原来的两倍,则赋值为2
- interpolation:插值方法的标志。
fx , yx 与 dsize 若存在冲突选用dsize
//************************************
// Method: sizeChange
// FullName: sizeChange
// Access: public
// Returns: void
// Qualifier: 尺寸变换
//************************************
void sizeChange()
{
// 尺寸变换
Mat smallImg, bigImg0, bigImg1, bigImg2;
Mat gray = imread("./lena.png", IMREAD_GRAYSCALE);
// 缩小
resize(gray, smallImg, Size(15, 15), 0, 0, INTER_AREA);
// 最近邻插值放大
resize(smallImg, bigImg0, Size(30, 30), 0, 0, INTER_NEAREST);
// 双线性插值
resize(smallImg, bigImg1, Size(30, 30), 0, 0, INTER_LINEAR);
// 双三次插值
resize(smallImg, bigImg2, Size(30, 30), 0, 0, INTER_CUBIC);
namedWindow("smallImage", WINDOW_NORMAL);
imshow("smallImage", smallImg);
namedWindow("bigImg0", WINDOW_NORMAL);
imshow("bigImg0", bigImg0);
namedWindow("bigImg1", WINDOW_NORMAL);
imshow("bigImg1", bigImg1);
namedWindow("bigImg2", WINDOW_NORMAL);
imshow("bigImg2", bigImg2);
waitKey(0);
}
翻转
flip()
void cv::flip(InputArray src,
OutputArray dst,
int flipCode)
-
src:输入图像
-
dst:输出图像
-
flipCode:翻转方式标志
标志 含义 大于0 绕y轴进行翻转 等于0 绕x轴进行翻转 小于0 绕两个轴进行翻转
//************************************
// Method: reverImg
// FullName: reverImg
// Access: public
// Returns: void
// Qualifier: 图像翻转
//************************************
void reverImg()
{
Mat img = imread("./lena.png");
Mat imgx, imgy, imgx_y;
flip(img, imgx, 0);
flip(img, imgy, 1);
flip(img, imgx_y, -1);
imshow("img", img);
imshow("imgx", imgx);
imshow("imgy", imgy);
imshow("imgx_y", imgx_y);
waitKey(0);
}
拼接
vconcat()纵向连接
void cv::vconcat(const Mat* src,
size_t nsrc,
OutputArray dst)
- src:Mat 矩阵类型的数组
- nsrc:数组中Mat类型数据的数目
- 连接后的Mat类矩阵
横向拼接要求高度一致
纵向拼接要求宽度一致
void cv::vconcat(InputArray src1,
InputArray src2,
OutputArray dst)
- 第一个需要连接的Mat类矩阵
- 第二个需要连接的Mat类矩阵
- 连接后的Mat类矩阵
hconcat纵向连接
void cv::hconcat(const Mat* src,
size_t nsrc,
OutputtArray dst)
void cv::hconcat(InputtArray src1,
InputtArray src2,
OutputtArray dst)
//************************************
// Method: imgJoint
// FullName: imgJoint
// Access: public
// Returns: void
// Qualifier: 图像拼接
//************************************
void imgJoint()
{
Mat img00 = imread("./img00.png");
Mat img01 = imread("./img01.png");
Mat img10 = imread("./img10.png");
Mat img11 = imread("./img11.png");
Mat imgl, imgr, img;
// 纵向拼接
vconcat(img00, img10, imgl);
vconcat(img01, img11, imgr);
// 横向拼接
hconcat(imgl, imgr, img);
}