当前位置: 代码网 > it编程>编程语言>Asp.net > Opencv-图像插值与LUT查找表

Opencv-图像插值与LUT查找表

2024年07月28日 Asp.net 我要评论
opencv中resize()函数的实现原理0就是通过插值算法,如果不对应用某种算法进行设置,则默认采用双线性插值算法。双线性插值(Bilinear Interpolation):双线性插值是用原图像中4(22)个点计算新图像中1个点,效果略逊于双三次插值,速度比双三次插值快,属于一种平衡美,在很多框架中属于默认算法。双三次插值(Bicubic interpolation):双三次插值是用原图像中16(44)个点计算新图像中1个点,效果比较好,但是计算代价过大。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)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com