2012/11/13

色の扱い

色とは

色とはなんだ。
ゴリラの色覚は人間と同じだ。 http://web2.chubu-gu.ac.jp/web_labo/mikami/brain/25-2/index-25-2.html

色空間

RGB、HSV、Labとか
http://ja.wikipedia.org/wiki/%E8%89%B2%E7%A9%BA%E9%96%93

OpenCVにおける色

チャンネルで表す。
http://opencv.jp/cookbook/opencv_mat.html 
CV_8UC3というのは、3チャンネルのunsigned char(uchar)である。


読み込み

いま、カラーの画像を読み込む。
Mat image = imread("images\\gori.png", CV_LOAD_IMAGE_COLOR);
このときimageのデータ型はCV_8UC3となっている。
色空間はBGR(RGBでない)だ。

カラー画像であってもグレイスケールで読み込むこともできる。
Mat image = imread("images\\gori.png", CV_LOAD_IMAGE_GRAYSCALE);
imageのデータ型はCV_8UC1、つまりCV_8U(2つは同じ意味)となっている。 色はグレイスケールに変換される。

変換

Mat image = imread("images\\gori.png", CV_LOAD_IMAGE_COLOR);
Mat grayImage;
cvtColor(image, grayImage, CV_BGR2GRAY);
グレイスケールに変換され、grayImageはCV_8Uとなる。
ということでもちろんHSVに変換するなら
Mat image = imread("images\\gori.png", CV_LOAD_IMAGE_COLOR);
Mat hsvImage;
cvtColor(image, hsvImage, CV_BGR2HSV);
HSV表色系に変換され、hsvImageはCV_8UC3となり、各チャンネルにはH、S、Vの値が格納される。


チャンネルの分離

チャンネルを分離したい時は複チャンネルMatに対してsplit()を用いる。
ここではあるHSV画像hsvImageを用いる。
vector<Mat> planes;
split(hsvImage, planes);
この処理で、planes[0]にH、planes[1]にS、planes[2]にVのMatが格納される。
それぞれのデータ型はCV8Uだ。
なお、この分離によってMatのチャンネルはコピーされている。
例でいうと、分離後のplanes[0]を編集してもhsvImageには影響しない、ということだ。

チャンネルの統合

planesを各チャンネルにもつMatを生成する。
Mat hsvImage;
merge(planes, hsvImage);
planesは同じデータ型、同じサイズのMat配列(vector)である。

ピクセル選択

CV_8UC3のatは
Vec3b hsv = hsvImage.at<Vec3b>(y, x);
とかく。
Vec3bとはOpenCVで定義される型で、uchar型3要素のベクターだ。
http://opencv.willowgarage.com/documentation/cpp/basic_structures.html#vec 
hsv[0], hsv[1], hsv[2] にそれぞれH, S, Vの値(uchar型)が格納されている。

0 件のコメント:

Related Posts Plugin for WordPress, Blogger...