OPenCV版本:4.4
IDE:VS2019
功能描述
执行一个矩阵的查找表的转换。
函数LUT用查找表里的值填充输出矩阵,条目索引来自于输入矩阵,也就是说,函数按如下公式处理每个src的元素:
[ dst ( I ) ← lut(src(I) + d) ] [\texttt{dst} (I) \leftarrow \texttt{lut(src(I) + d)}] [dst(I)←lut(src(I) + d)]
这儿
函数原型
CV_EXPORTS_W void LUT(InputArray src, InputArray lut, OutputArray dst);
参数描述
-
@参数 src 8位元素的输入矩阵
-
@参数 lut 256个元素的查找表.如果输入通道是多通道,查找表应该具有一个单一的通道(这种情况下同样的表被用于所有的通道)或者和输入矩阵具有同样的通道数。
-
@参数dst 输出矩阵,和src具有同样的大小和通道数,和lut具有同样的深度。
-
参考
源码示例(单通道)
实现的是把一张图的灰度0-128的变成0,128-200的变成128,其余的变成255
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");
uchar lutTable[256];
for (int i = 0; i < 256; i++)
{
if (i <= 128)
{
lutTable[i] = 0;
}
else if (i > 128 && i <= 200)
{
lutTable[i] = 128;
}
else
{
lutTable[i] = 255;
}
}
cv::Mat out;
cv::Mat lut(1, 256, CV_8UC1, lutTable);
cv::LUT(image, lut, out);
imshow("原图", image);
imshow("lut", out);
cv::waitKey(0);
return 0;
}
运算结果
输入矩阵:
输出矩阵:
源码示例(三通道)
实现的是:
第一通道中灰度值0-128的变成0,灰度值129-200的变成128,灰度值201-255的变成200
第二通道中灰度值0-128的变成16,灰度值129-200的变成144,灰度值201-255的变成216
第三通道中灰度值0-128的变成32,灰度值129-200的变成176,灰度值201-255的变成255
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");
uchar lutTable[256*3];
for (int i = 0; i < 256; i++)
{
if (i <= 128)
{
lutTable[i*3] = 0;
lutTable[i * 3 + 1] = 16;
lutTable[i * 3 + 2] = 32;
}
else if (i > 128 && i <= 200)
{
lutTable[i * 3] = 128;
lutTable[i * 3 + 1] = 144;
lutTable[i * 3 + 2] = 176;
}
else
{
lutTable[i * 3] = 200;
lutTable[i * 3 + 1] = 216;
lutTable[i * 3 + 2] = 255;
}
}
cv::Mat out;
cv::Mat lut(1, 256, CV_8UC3, lutTable);
cv::LUT(image, lut, out);
imshow("原图", image);
imshow("lut", out);
cv::waitKey(0);
return 0;
}
运算结果
输入矩阵图像:
输出图像: