OpenCV 查詢表修改畫素與LUT用法
阿新 • • 發佈:2018-12-19
然而,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; }
結果是一樣的!