当前位置: 首页 > article >正文

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轴对称

http://www.kler.cn/a/108756.html

相关文章:

  • 第8章 利用CSS制作导航菜单
  • 2-UML概念模型测试
  • C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信
  • c/c++--struct对比
  • Arrays.sort与Collections.sort:深入解析Java中的排序算法
  • 【论文阅读】利用SEM二维图像表征黏土矿物三维结构
  • IntelliJ IDEA 把package包展开和压缩
  • Ubuntu 22.04自动登录进入桌面
  • Error: error:0308010C:digital envelope routines::unsupported
  • YOLOv7-QAT量化部署
  • 软考系统架构师知识点集锦二:软件工程
  • 51单片机实验:数码管动态显示00-99
  • Vert.x学习笔记-异步编程和响应式系统
  • 云安全-云原生技术架构(Docker逃逸技术-特权与危险挂载)
  • 外部中断0边沿触发
  • Docker中Failed to initialize NVML: Unknown Error
  • 3DMAX快速瓦片屋顶铺设插件使用方法详解
  • JavaScript进阶知识汇总~
  • Linux--进程替换
  • C++中的成员变量内存布局
  • MinIO安装
  • Ubuntu ARMv8编译Qt源码以及QtCreator
  • NEFU数字图像处理(三)图像分割
  • 安全狗安装
  • Angular-05:管道
  • ip地址默认子网掩码怎么算