本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


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

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

代码清单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中给出。

代码清单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程序运行结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】Windows系统中安装OpenCV 4
【OpenCV 4开发详解】Ubuntu系统中安装OpenCV 4
【OpenCV 4开发详解】opencv_contrib扩展模块的安装
【OpenCV 4开发详解】Image Watch插件的使用
【OpenCV 4开发详解】安装过程中问题解决方案
【OpenCV 4开发详解】了解OpenCV的模块架构
【OpenCV 4开发详解】Mat类介绍
【OpenCV 4开发详解】Mat类构造与赋值
【OpenCV 4开发详解】4种读取Mat类元素的的方法
【OpenCV 4开发详解】图像的读取与显示
【OpenCV 4开发详解】视频加载与摄像头调用
【OpenCV 4开发详解】图像与视频的保存
【OpenCV 4开发详解】保存和读取XML和YMAL文件
【OpenCV 4开发详解】颜色模型与转换
【OpenCV 4开发详解】多通道分离与合并
【OpenCV 4开发详解】图像像素统计
【OpenCV 4开发详解】两图像间的像素操作
【OpenCV 4开发详解】图像二值化
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】图像LUT查找表相关推荐

  1. 【OpenCV 4开发详解】图像膨胀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】图像腐蚀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】图像距离变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】图像连通域分析

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】图像卷积

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像直方图绘制

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】图像金字塔

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】图像上绘制几何图形

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. HTML5手机端几秒钟自动跳转
  2. php return 返回html_【php socket通讯】php实现http服务
  3. PHP的microtime
  4. Java当中包装类的理解和一些常用方法的分享(学习后分享)
  5. python1乘到10_python写一个循环1+到10打印计算步骤的脚本——纯粹无聊玩的
  6. 【电脑帮助】解决Wind10系统桌面没有“我的电脑”图标的问题
  7. 智能优化算法:入侵杂草优化算法-附代码
  8. 使用LINQ to SQL更新数据库(中):几种解决方案
  9. Atitit.uke 团队建设的组织与运营之道attilax总结
  10. Java实现地图的导出
  11. 一群人在网上直播自己怎么写代码,而且还有人爱看
  12. 联想笔记本计算机在哪里找不到,Win10 Lenovo笔记本电脑显示找不到相机
  13. Lookup函数的使用方法介绍(含VLookup和HLookup)
  14. ConvMAE:当Masked卷积遇见何恺明的MAE
  15. day3-转自金角大王
  16. 如何把身份证扫描成电子版?证件转电子版,这3个方法超好用
  17. TCP/UDP网络的通信
  18. ES集群安全重启节点的正确方法
  19. Vs2013未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包 解决方案
  20. 激荡二十五年:wind、同花顺、东方财富、大智慧等金融服务商争霸史

热门文章

  1. 一周焦点 | 最强AI芯片麒麟980发布;前端开发者将被取代?
  2. 吴恩达最新成果 CheXNet详解:肺炎诊断准确率超专业医师
  3. 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
  4. PYTHON编程导论群问题汇总(一)
  5. 于正AI换脸火上热搜,差点骗了全网!古风民族风也能任意切换
  6. 他智商167,超过爱因斯坦,花17年炸遍美国高校,却因一疏漏被捕
  7. AI新作品:照片迅速被画成艺术画
  8. 动漫:史上最简(详细)KMP算法讲解,看不懂算我输!
  9. golang源码分析-启动过程概述
  10. Linux之vim中翻页的命令