Opencv-图像插值与LUT查找表

图像像素的比较

白色是255,黑色是0

min(InputArray src1,
		InputArray src2,
		OutputArray dst)
max(InputArray src1,
	InputArray src2,
	OutpurArray dst
  • src1:第一个图像矩阵,通道数任意
  • src2:第二个图像矩阵,尺寸和通道数以及数据类型都需要与src1一致
  • dst:保留对应位置较大(较小)灰度值后的图像矩阵,尺寸、通道数和数据类型与src1一致

LUT查找表

LUT查找表实际上就是一种映射规则
在这里插入图片描述

LUT(InputArray src,InputArray lut,OutputArray dst)
src:输入图像矩阵,其数据类型只能是CV_8U
lut:256个像素灰度值的查找表,单通道或者与src通道数相同
dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同
	//LUT查找表第一层
	uchar lutFirst[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
			lutFirst[i] = 0;
		if (i > 100 && i <= 200)
			lutFirst[i] = 100;
		if (i > 200)
			lutFirst[i] = 255;
	}
	Mat lutOne(1, 256, CV_8UC1, lutFirst);

	//LUT查找表第二层
	uchar lutSecond[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
			lutSecond[i] = 0;
		if (i > 100 && i <= 150)
			lutSecond[i] = 100;
		if (i > 150 && i <= 200)
			lutSecond[i] = 150;
		if (i > 200)
			lutSecond[i] = 255;
	}
	Mat lutTwo(1, 256, CV_8UC1, lutFirst);
	//LUT查找表第三层
	uchar lutThird[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
			lutThird[i] = 100;
		if (i > 100 && i <= 200)
			lutThird[i] = 200;
		if (i > 200)
			lutThird[i] = 255;
	}

	Mat lutThree(1, 256, CV_8UC1, lutThird);

	//拥有三通道的LUT查找表矩阵
	vector<Mat>mergeMats;
	mergeMats.push_back(lutOne);
	mergeMats.push_back(lutTwo);
	mergeMats.push_back(lutThree);

	Mat LutTree;
	merge(mergeMats, LutTree);

	Mat img = imread("2.jpg");
	Mat gray, out0, out1, out2;
	cvtColor(img, gray, COLOR_BGR2GRAY);
	LUT(gray, lutOne, out0);
	LUT(img, lutOne, out1);
	LUT(img, LutTree, out2);
	imshow("out0", out0);
	imshow("out1", out1);
	imshow("out2", out2);
	waitKey(0);

图像尺寸改变

图像插值原理

在日常对图像进行操作的过程中会涉及到图像的放大与缩小,这一系列的操作都是通过插值法来实现的;opencv中resize()函数的实现原理0就是通过插值算法,如果不对应用某种算法进行设置,则默认采用双线性插值算法。
常用插值算法
最近邻法(Nearest Interpolation):计算速度最快,但是效果最差。
双线性插值(Bilinear Interpolation):双线性插值是用原图像中4(22)个点计算新图像中1个点,效果略逊于双三次插值,速度比双三次插值快,属于一种平衡美,在很多框架中属于默认算法。
双三次插值(Bicubic interpolation):双三次插值是用原图像中16(44)个点计算新图像中1个点,效果比较好,但是计算代价过大。
jj’

在这里插入图片描述

图像缩放
resize(InputArray src,OutputArray dst,Size dsize,double fx=0,double fy=0,int interpolation = INTER_LINEAR)
dsize:输出图像的尺寸 
fx:水平轴的比例因子:如果将水平轴变为原来的两倍,则赋值为2
fy:垂直轴的比例因子
interpolation:插值方法的标志

图像翻转
filp(InputArray src,OutputArray dst,int flipCode)
flipCode:翻转方式标志,数值大于0表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转,数值小于0表示绕两个轴旋转
图像拼接
//横向拼接要求高度一致
hconcat(InputArray src1,InputArray src2,OutputArray dst)
//垂直拼接要求宽度一致
vconcat(InputArray src1,InputArray src2,OutputArray dst) 
	Mat img = imread("2.jpg");
	Mat out,out1,out2,out3;
	// 缩小
	resize(img, out, Size(500,500),0, 0, INTER_AREA);
	// 最近邻插值
	resize(img, out1, Size(200, 200), 0, 0, INTER_NEAREST);
	//双线性插值
	resize(img, out2, Size(200, 200), 0, 0, INTER_LINEAR);
	//双三次插值
	resize(img, out3, Size(200, 200), 0, 0, INTER_CUBIC);
	
	Mat img_x, img_y, img_xy;
	flip(img, img_x, 0); //沿x轴对称翻转
	flip(img, img_y, 1); //沿y轴对称翻转
	flip(img, img_xy, -1);//沿x轴对称,再y轴对称
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值