前面介绍的阈值比较方法中只有一个阈值,如果需要与多个阈值进行比较,就需要用到显示查找表(Look-Up-Table,LUT)。LUT查找表简单来说就是一个像素灰度值的映射表,它以像素灰度值作为索引,以灰度值映射后的数值作为表中的内容。例如我们有一个长度为5的存放字符的数组,LUT查找表就是通过这个数组将0映射成a,将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-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. }
标签:LUT,映射,18,数据类型,查找,灰度,256 From: https://www.cnblogs.com/okmai77xue/p/17300238.html