天天看點

opencv2—(8)查找表修改圖像外觀

圖像直方圖捕捉方式呈現一個場景使用可像素強度值。通過分析像素值得分布在一個圖像,可以使用此資訊來修改甚至可以提高一個圖像。查找表定義了如何将像素值轉換為新的值。表的第i項表示相應對應灰階的新值。newIntensity= lookup [ oldIntensity ]  ; OpenCV cv::LUT 對圖像應用查找表以生成新圖像。 可能說到這裡,大家還是不太清楚怎麼用,下面寫兩個函數來建立不同的table實作圖像外觀的修改 第一個函數:降低顔色空間 那麼讓我們回顧之前 opencv2—(3)周遊圖像 中介紹的降低顔色數目的算法,把RGB空間劃分為同等大小的格子,每個緯度的顔色降低為原來的1/8,那麼總的顔色數為32*32*32,原始圖像的每個顔色都替換為所在格子中心對應的顔色。而今天我們将使用查找表的方法,來實作降低顔色空間的方法。 第二個函數:顔色反轉 交換強度值即可 第三個函數:增強對比度(思考題) 提高對比度的查找表旨在檢測直方圖中的非零項的最低(imin)和最高(imax)強度值,這樣(imin)值被映射到強度0,(imax)值被映射到255。

下面貼程式:

#include <opencv2\highgui\highgui.hpp> #include <opencv2\core\core.hpp> #include <iostream> using namespace std; using namespace cv; #define QUAN_VAL1           (10) #define QUAN_VAL2           (100) //降低顔色空間的table void CreateLookupTable( Mat & table , uchar quan_val ) {         table .create(1, 256, CV_8UC1 );         uchar *p = table .data;         for ( int i = 0; i < 256; ++i)        {               p[i] = quan_val *(i / quan_val );        } } //顔色反轉 void CreateLookupTable1( Mat & table ) {         table .create(1, 256, CV_8UC1 );         uchar *p = table .data;         for ( int i = 0; i < 256; i++)        {               p[i] = 255 - i;        } } int main( int argc , char * argv []) {         Mat img;         Mat out1,out2,out3;        img = imread( "group.jpg" , 1);         Mat table;        CreateLookupTable(table, QUAN_VAL1 );        LUT(img, table, out1);// 使用  LUT(img, table, out)的時候就等價于out[rows][cols]=table[(img[rows][cols]) ]        CreateLookupTable(table, QUAN_VAL2 );        LUT(img, table, out2); 

        CreateLookupTable1(table);         LUT(img, table, out3);

       namedWindow( "Lena" , CV_WINDOW_NORMAL );        imshow( "Lena" , img);        namedWindow( "QUAN_VAL=10" , CV_WINDOW_NORMAL );        imshow( "QUAN_VAL=10" , out1);        namedWindow( "QUAN_VAL=100" , CV_WINDOW_NORMAL );        imshow( "QUAN_VAL=100" , out2);         namedWindow( "顔色反轉" , CV_WINDOW_NORMAL );         imshow( "顔色反轉" , out3);

       waitKey(0);         return 0; }

分析: 查找表其實就相當于函數的一種映射關系 x=0:255 ,y = f(x),當然關于f(x)的具體形式可以是任意的,本文的形式是 1、 p[i] =quan_val * (i /quan_val); 2、 p[i] =255-i 3、 ? i相當于x,p相當于y,隻是我們可以先把它們的映射關系存起來放在table中,到了調用LUT函數時,就不用再去計算這樣的映射關系,而是通過通路剛剛存放的table來擷取結果,在資料大的情況下,減少了計算的時間,顯得更高效。

下面是結果:

opencv2—(8)查找表修改圖像外觀