OpenCV实验系列之查表函数LUT()的使用
LUT()查表函数功能说明
LUT函数是用于对Mat矩阵数据进行快速遍历修改的函数,从官网给出的性能对比上可以看出对比其他遍历方法,其在速度上有极大的优势。
但该函数只能对八位的矩阵数据进行遍历,对于其他数据格式则需要进行其它方式的遍历处理。
LUT()的基本思想
LUT()基本思想是查表,既将矩阵中所有可能遇到的值都计算一遍储存在数组中,在遍历过程中只是将对应的查表值进行赋值即可,这样可以避免大量的重复计算,这是典型的使用存储空间换取速度的做法。但这也限制了其应用范围,其只能运用于有限结果的计算。
LUT()的基本使用方法
以下是根据官方手册提供的例程更改的典型使用方法
Mat I;//输入矩阵
Mat J;//输出矩阵
Mat lookUpTable(1, 256, CV_8U);//查表用矩阵
uchar* p = lookUpTable.ptr();//填充查表值
for( int i = 0; i < 256; ++i)
p[i] = table[i];//table[i]为i经计算后的值,可替换为公式。
LUT(I, lookUpTable, J);//进行遍历
LUT()例程
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void main()
{
double t = (double)getTickCount();//计时开始
Mat src;
src=imread("shape.png",IMREAD_GRAYSCALE);
imshow("src",src);
Mat dst = src.clone();
imshow("dst",dst);
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.ptr();
for( int i = 0; i < 256; ++i)
p[i] = i/2;
LUT(src,lookUpTable,dst);
imshow("dst_scan",dst);
t = ((double)getTickCount() - t)/getTickFrequency();//计算耗时
cout << "Times passed in seconds: " << t << endl;
waitKey(0);
}
原图
遍历处理后图片