首页
登录 | 注册

OpenCV实验系列之查表函数LUT()的使用

OpenCV实验系列之查表函数LUT()的使用

  • OpenCV实验系列之查表函数LUT的使用
    • LUT查表函数功能说明
    • LUT的基本思想
    • LUT的基本使用方法
    • LUT例程

LUT()查表函数功能说明

LUT函数是用于对Mat矩阵数据进行快速遍历修改的函数,从官网给出的性能对比上可以看出对比其他遍历方法,其在速度上有极大的优势。
OpenCV实验系列之查表函数LUT()的使用

但该函数只能对八位的矩阵数据进行遍历,对于其他数据格式则需要进行其它方式的遍历处理。

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

OpenCV实验系列之查表函数LUT()的使用

原图
OpenCV实验系列之查表函数LUT()的使用

遍历处理后图片



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.009 s.
京ICP备10005923号