天天看點

OpenCV中LUT函數的使用

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)]

這兒

OpenCV中LUT函數的使用

函數原型

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;
}
           

運算結果

輸入矩陣:

OpenCV中LUT函數的使用

輸出矩陣:

OpenCV中LUT函數的使用

源碼示例(三通道)

實作的是:

第一通道中灰階值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;
}
           

運算結果

輸入矩陣圖像:

OpenCV中LUT函數的使用

輸出圖像:

OpenCV中LUT函數的使用