何かしらのスカラー場を表現しようとしたときに,各画素に対してグレースケールで値をセットしてやれば一応可視化は出来るのですが,やはりカラーで表現したほうがきれいです.その場合,値の大小に対して,赤←→青で表現すると見やすいです.
そんな時にはRGB色空間ではなめらかに赤←→青の変化をつけるのが難しいので,HSV色空間を使います.処理としては,画像を一旦HSV色空間へ変換し,値をセットした後でRGB色空間へ戻せばOK.実際のコードは次のようになります.
#include <cv.h> #include <highgui.h> // h は 0から180までの値で1周なので,120までを使う const double max_hue=120.0; unsigned char func(int x, int y, int cols){ // 今回は,x座標に応じてhの値を設定 return max_hue*x/cols; } int main(){ // 出力用画像 cv::Mat img=cv::Mat::zeros(480,640,CV_8UC3); //// HSV色空間での色表示ここから // HSVの画像へ変換 cv::cvtColor(img,img,CV_BGR2HSV); unsigned char h,s,v; h=0; // 値に応じて変化させる s=255; // 固定 v=255; // 固定 for(int y=0;y<img.rows;y++){ for(int x=0;x<img.cols;x++){ h=func(x,y,img.cols); // 適当な関数で値を決める // 画像の(y,x)位置に値をセット img.at<cv::Vec3b>(y,x)=cv::Vec3b(h,s,v); } } // BGRの画像へもどす cv::cvtColor(img,img,CV_HSV2BGR); //// ここまで // 表示 cv::imshow("Result",img); cv::waitKey(); return 0; }