OpenGL de プログラミング - ルックアップテーブル
現在地 >> メニュー >> サンプルコード::OpenCV >> ルックアップテーブル

問題


以下の画像を読み込んで、ルックアップテーブルを用いて、減色せよ。

画像

答え


#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace std;


void MAKE_LUT(unsigned char *table);
void LOOK_UP_TABLE(IplImage *imgA,IplImage *imgB,unsigned char *table);



int main( int argc, char **argv)
{

IplImage *imgA = cvLoadImage( "test2.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
if(imgA ==NULL)
{
cout<<"Can't Load Image ." << endl;
exit(0);
}

cvNamedWindow("ORIGINAL",CV_WINDOW_AUTOSIZE);
cvShowImage("ORIGINAL",imgA);



unsigned char table[256];
MAKE_LUT(table); //LUT用データ作成

LOOK_UP_TABLE(imgA,imgA ,table); //第2引数が出力



cvNamedWindow("LUT",CV_WINDOW_AUTOSIZE);
cvShowImage("LUT",imgA);

cvWaitKey(0);

cvReleaseImage( &imgA );
cvDestroyAllWindows();

return 0;
}



/*********************[ここから、各種関数]*********************/
void MAKE_LUT(unsigned char *table)
{

for(int i = 0; i < 256; i++)
{
if(i >= 0 && i < 32 ) table[i] = 31;
else if(i >= 32 && i < 64) table[i] = 63;
else if(i >= 64 && i < 96) table[i] = 95;
else if(i >= 96 && i < 128)table[i] = 127;
else if(i >=128 && i < 160)table[i] = 159;
else if(i >=160 && i < 192)table[i] = 191;
else if(i >=192 && i < 224)table[i] = 223;
else table[i] = 255;
}

}


void LOOK_UP_TABLE(IplImage *imgA, IplImage *imgB, unsigned char *table)
{

CvMat* lut_mat;
lut_mat = cvCreateMatHeader( 1, 256, CV_8UC1 );
cvSetData( lut_mat, table, 0 );
cvLUT( imgA, imgB, lut_mat );
cvReleaseMat( &lut_mat );

}