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

这儿

在这里插入图片描述

函数原型

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

运算结果

输入矩阵图像:
在这里插入图片描述
输出图像:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值