opencv#18 图像尺寸变换

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值