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具有同樣的深度。
-
參考
convertScaleAbs, Mat::convertTo
源碼示例(單通道)
實作的是把一張圖的灰階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;
}
運算結果
輸入矩陣圖像:
輸出圖像: