何かしらのスカラー場を表現しようとしたときに,各画素に対してグレースケールで値をセットしてやれば一応可視化は出来るのですが,やはりカラーで表現したほうがきれいです.その場合,値の大小に対して,赤←→青で表現すると見やすいです.
そんな時には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;
}