• Opencv-图像插值与LUT查找表


    图像像素的比较

    白色是255,黑色是0

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

    LUT查找表

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

    LUT(InputArray src,InputArray lut,OutputArray dst)
    src:输入图像矩阵,其数据类型只能是CV_8U
    lut:256个像素灰度值的查找表,单通道或者与src通道数相同
    dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同
    
    • 1
    • 2
    • 3
    • 4
    	//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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    图像尺寸改变

    图像插值原理

    在日常对图像进行操作的过程中会涉及到图像的放大与缩小,这一系列的操作都是通过插值法来实现的;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:插值方法的标志
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    图像翻转
    filp(InputArray src,OutputArray dst,int flipCode)
    flipCode:翻转方式标志,数值大于0表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转,数值小于0表示绕两个轴旋转
    
    • 1
    • 2
    图像拼接
    //横向拼接要求高度一致
    hconcat(InputArray src1,InputArray src2,OutputArray dst)
    //垂直拼接要求宽度一致
    vconcat(InputArray src1,InputArray src2,OutputArray dst) 
    
    • 1
    • 2
    • 3
    • 4
    	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轴对称
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    postgresql 主备配置
    使用 Sealos 一键私有化部署 Serverless 框架 Laf
    【深度学习】实验13 使用Dropout抑制过拟合
    题目:Java 程序员的 10 道 XML 面试题
    2022-06-28 网工进阶(十三)IS-IS-路由过滤、路由汇总、认证、影响ISIS邻居关系建立的因素、其他命令和特性
    [附源码]计算机毕业设计JAVA个性化新闻推荐系统
    Flink基础实操-计算单词出现次数
    【Lua面试】 迭代器和泛型For
    字符设备模块实现进程间通信组件
    scapy sniff与command方法
  • 原文地址:https://blog.csdn.net/weixin_47020721/article/details/133848963