1. 程式人生 > >OpenCV 查詢表修改畫素與LUT用法

OpenCV 查詢表修改畫素與LUT用法

然而,OpenCV裡面已經有了相應函式可以讓我們更加方便地對畫素進行操作,那便是LUT函式,而且推薦使用OpenCV的內建函式,因為已經針對晶片做了優化設計,使得速度有很大提升。

函式原型為:void LUT(InputArray src, InputArray lut, OutputArray dst)

第一個引數:原始影象的地址; 第二個引數:查詢表的地址,對於多通道影象的查詢,它可以有一個通道,也可以與原始影象有相同的通道; 第三個引數:輸出影象的地址。

實現的對映關係如下所示: 在這裡插入圖片描述 也就是說比如原來src中值為1會對映為table[1]所對應的值再加上d。

所以上面的操作,我們其實只需要使用LUT函式就可以了。結合我們自己設計的table表,就能夠實現對影象的操作。

#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<math.h>
using namespace cv;
using namespace std;

int main()
{
	string picName="C://1.bmp";
	Mat A=imread (picName,CV_LOAD_IMAGE_GRAYSCALE);    //讀入灰度影象
	Mat lookUpLut(1,256,CV_8UC1);   //建立一個256個元素的對映表lookUpLut
	imshow ("變換前",A);
	for (int i=0;i<256;i++)
	{
		lookUpLut.at<uchar>(i)=i/100*100;   //用at操作對映表的畫素
	}
	Mat B;
	LUT (A,lookUpLut,B);    //LUT查表變換
	imshow ("變換後",B);
	waitKey (0);
	return 0;
}

效果圖: 在這裡插入圖片描述 我們得出一些結論: 儘量使用 OpenCV 內建函式. 呼叫LUT 函式可以獲得最快的速度. 這是因為OpenCV庫可以通過英特爾執行緒架構啟用多執行緒,下面的opencv矩陣操作均是優化的多執行緒並行處理,較高效

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat src=imread("C://1.bmp");  
    if(!src.data)
    {
        cout<<"error! The image is not built!"<<endl;
        return -1;
    }
    // 為了演示效果,將圖片轉換成灰度圖片
    Mat img1=src;
    //cvtColor( src, img1, CV_RGB2GRAY );
    imshow("First",img1);
    //建立查詢表
    Mat lookUpLut(1, 256, CV_8U);
    for(int i=0; i<256; i++)
	{
       lookUpLut.at<uchar>(i)=255-i;
	}
    //通過LUT函式實現影象取反
    LUT(img1,lookUpLut,img1);

    imshow("Second",img1);
    waitKey();
    return 0;
}

在這裡插入圖片描述 結果是一樣的!