OpenCVでカラーでスカラー場を可視化する場合

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

コメントする