1.图像插值原理
我们对图像进行操作的时候,会对图像进行拉伸缩放等一系列变换,这个会造成图像中某个像素点变换前后的位置发生改变,如图所示,有两个像素在进行变换后,造成两个像素同时映射在同一个位置,还有如图,有两个相邻的像素,在变换后这两个像素之间多出了像素...这些问题就带来了图像像素插值,所谓插值就是 如何根据已有像素去推测未知像素的像素值,常用方法有:最邻近法,线性差值法,双线性差值法。
最邻近法就是谁离得最近就跟谁相似,这种方式比较简单,但是对于插值效果较差。
双线性差值是在应用了两次线性插值原理的基础上,来得到估计像素值的算法。
如果知道了某一点P周围的四个像素点时,可以根据四个像素点之间的相对运算,来得到点P的像素值。
差值原理大致相似,目的就是估计出未知区域的像素值,,这样的插值过程常应用在图像的拉伸,旋转,仿射变换,透视变换等等...
图像缩放:resize()
vodi cv::resize(InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR
)
·src:输入图像。
·dst:输出图像,图像的数据类型与src相同。
·dsize:输出图像尺寸。
·fx:水平轴的比例因子,如果将水平轴变为原来的两倍,则赋值为2。
·fy:垂直轴的比例因子,如果将垂直轴变为原来的两倍,则赋值为2.
·interpolation:差值方法的标志。
图像翻转flip()
void cv::flip(InputArray src,
OutputArray dst,
int flipCode
)
·src:输入图像。
·dst:输出图像,与src具有相同大小和数据类型以及通道数。
·flipCode:翻转方式标志,数值大于0表示绕y轴进行翻转,数值等于0,表示绕x轴进行翻转,数值小于0表示绕两个轴进行旋转。
图像拼接hconcat(),vconcat()
hconcat()横向拼接
void cv::hconcat(InputArray src1,
InputArray src2,
OutputArray dst
)
vconcat()纵向拼接
void cv::vconcat(InputArray src1,
InputArray src2,
OutputArray dst
)
·src1:第一个需要连接的Mat类矩阵。
·src2:第二个需要连接的Mat类矩阵,与第一个参数具有相同的宽度,数据类型和通道数。
·dst:连接后的Mat类矩阵。
示例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv; //opencv的命名空间
using namespace std;
int main()
{
Mat gray = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png",IMREAD_GRAYSCALE);//以灰度形式读取
Mat smallimg, bigimg0, bigimg1, bigimg2;
resize(gray, smallimg, Size(15, 15), 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); //双三次差值
//翻转
Mat img_x, img_y, img_xy;
flip(gray, img_x, 0); //沿x轴对称
flip(gray, img_y, 1); //沿y轴对称
flip(gray, img_xy, -1);//先x轴对称,再y轴对称
Mat img00 = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");
Mat img01 = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");
Mat img10 = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");
Mat img11 = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/lenac.png");
//显示4个子图像
//图像连接
Mat img, img0, img1;
//图像横向连接
hconcat(img00, img01, img0);
hconcat(img10, img11, img1);
//横向连接结果进行竖向连接
vconcat(img0, img1, img);
//显示连接图像的结果
waitKey(0);
return 0;