图像尺寸变换

图像尺寸变换

图像插值原理

由于对图像的操作存在拉伸变换,造成变换前后图像像素点位置发生变化。

  • 两个像素合并成一个像素
  • 两个相邻像素中间多出位置
最邻近法

选择临近的像素。简单,效果较差

线性插值法

选择临近两个像素,建立一次函数,进行投影,得到的数据

双线性插值法

选择临近的四个像素,四个像素两两建立一次函数,再把像素投影到建立好的一次函数上再次建立一次函数得到数据。

应用图像的拉伸变换、旋转、仿射变换、透视变换等涉及到对图像像素位置改变的情况。

图像缩放,反转,拼接

缩放

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值