前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【从零学习OpenCV 4】LUT查找表

【从零学习OpenCV 4】LUT查找表

作者头像
小白学视觉
发布2019-11-30 13:55:55
7940
发布2019-11-30 13:55:55
举报
文章被收录于专栏:深度学习和计算机视觉

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《从零学习OpenCV 4》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

前面介绍的阈值比较方法中只有一个阈值,如果需要与多个阈值进行比较,就需要用到显示查找表(Look-Up-Table,LUT)。LUT查找表简单来说就是一个像素灰度值的映射表,它以像素灰度值作为索引,以灰度值映射后的数值作为表中的内容。例如我们有一个长度为5的存放字符的数组,LUT查找表就是通过这个数组将0映射成a,将1映射成b,依次类推,其映射关系为。在OpenCV 4中提供了LUT()函数用于实现图像像素灰度值的LUT查找表功能,在代码清单3-20中给出了该函数的原型。

代码语言:javascript
复制
代码清单3-20 LUT()函数原型
1.  void cv::LUT(InputArray src,
2.                  InputArray lut,
3.                  OutputArray dst
4.                 )
  • src:输入图像矩阵,其数据类型只能是CV_8U。
  • lut:256个像素灰度值的查找表,单通道或者与src通道数相同。
  • dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同。

该函数的第一个输入参数要求的数据类型必须是CV_8U类型,但是可以是多通道的图像矩阵。第二个参数根据其参数说明可以知道输入量是一个1×256的矩阵,其中存放着每个像素灰度值映射后的数值,其形式如图3-17所示。如果第二个参数是单通道,则输入变量中的每个通道都按照一个LUT查找表进行映射;如果第二个参数是多通道,则输入变量中的第i个通道按照第二个参数的第i个通道LUT查找表进行映射。与之前的函数不同,函数输出图像的数据类型不与原图像的数据类型保持一致,而是和LUT查找表的数据类型保持一致,这是因为将原灰度值映射到新的空间中,因此需要与新空间中的数据类型保持一致。

图3-17 LUT查找表设置示例

为了体会LUT查找表处理图像后的效果,在代码清单3-21中给出通过LUT()函数将灰度图像和彩色图像分别处理的示例程序,程序中分别应用单通道和三通道的查找表对彩色图像进行映射,最终结果在图3-18中给出。

代码语言:javascript
复制
代码清单3-21 myLUT.cpp对图像进行查找表映射
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  
4.  using namespace std;
5.  using namespace cv;
6.  
7.  int main(int agrc, char** agrv)
8. {
9.    //LUT查找表第一层
10.    uchar lutFirst[256];
11.    for (int i = 0; i<256; i++)
12.    {
13.      if (i <= 100)
14.        lutFirst[i] = 0;
15.      if (i > 100 && i <= 200)
16.        lutFirst[i] = 100;
17.      if (i > 200)
18.        lutFirst[i] = 255;
19.    }
20.    Mat lutOne(1, 256, CV_8UC1, lutFirst);
21.  
22.    //LUT查找表第二层
23.    uchar lutSecond[256];
24.    for (int i = 0; i<256; i++)
25.    {
26.      if (i <= 100)
27.        lutSecond[i] = 0;
28.      if (i > 100 && i <= 150)
29.        lutSecond[i] = 100;
30.      if (i > 150 && i <= 200)
31.        lutSecond[i] = 150;
32.      if (i > 200)
33.        lutSecond[i] = 255;
34.    }
35.    Mat lutTwo(1, 256, CV_8UC1, lutSecond);
36.    
37.    //LUT查找表第三层
38.    uchar lutThird[256];
39.    for (int i = 0; i<256; i++)
40.    {
41.      if (i <= 100)
42.        lutThird[i] = 100;
43.      if (i > 100 && i <= 200)
44.        lutThird[i] = 200;
45.      if (i > 200)
46.        lutThird[i] = 255;
47.    }
48.    Mat lutThree(1, 256, CV_8UC1, lutThird);
49.  
50.    //拥有三通道的LUT查找表矩阵
51.    vector<Mat> mergeMats;
52.    mergeMats.push_back(lutOne);
53.    mergeMats.push_back(lutTwo);
54.    mergeMats.push_back(lutThree);
55.    Mat LutTree;
56.    merge(mergeMats, LutTree);
57.  
58.    //计算图像的查找表
59.    Mat img = imread("lena.png");
60.    if (img.empty())
61.    {
62.      cout << "请确认图像文件名称是否正确" << endl;
63.      return -1;
64.    }
65.  
66.    Mat gray, out0, out1, out2;
67.    cvtColor(img, gray, COLOR_BGR2GRAY);
68.    LUT(gray, lutOne, out0);
69.    LUT(img, lutOne, out1);
70.    LUT(img, LutTree, out2);
71.    imshow("out0", out0);
72.    imshow("out1", out1);
73.    imshow("out2", out2);
74.    waitKey(0);
75.    return 0;
76.  }

图3-18 myLUT.cpp程序运行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档