Opencv学习-LUT函数
这个函数大概意思根据自己设定的查找表,改变原本像素点值
例如:我们想将一张图片灰度为0-100的像素的灰度变成0,101-200的变成100,201-255的变成255。我们就可已建立如下的一张表格
当把此表格应用到图片时,图片0-100灰度的像素灰度就变成0,101-200的变成100,201-255的就变成255
1. 函数介绍
void cv::LUT(InputArray src, InputArray lut, OutputArray dst )
- src:输入图像矩阵,数据类型只能是 CV_8U。
- lut:256 个像素灰度值的查找表,单通道或者与 src 通道数相同。
- dst:输出图像矩阵,尺寸与 src 相同,数据类型与 lut 相同
2. 示例代码
#include <opencv2/opencv.hpp>
#include <iostream> using namespace std;
using namespace cv; int main()
{ //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); cout << "lutOne :" << lutOne << endl;//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, lutSecond); //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("../pic/gril_1.jpg"); if (img.empty()) { cout << "请确认图像文件名称是否正确" << endl; return -1; } Mat gray, out0, out1, out2; cvtColor(img, gray, COLOR_BGR2GRAY); LUT(gray, lutOne, out0); LUT(img, lutOne, out1); LUT(img, LutTree, out2); cout << "gray : " << gray << "\n\n\n\n\n\n\n\n\n\n\n\n\n out0 : " << out0 << endl; imshow("gray", gray); imshow("out0", out0); imshow("out1", out1); imshow("out2", out2); waitKey(0); return 0;
}
结果 :
lutOne的值
灰色图片一开始像素点的值
参照lutOne出来的照片一开始像素点的值(跟原先一开始的设定的对应上了)