画像から最大の明度,最小の明度などの特徴量を抽出する
void cvReduce( IplImage* src, IplImage* dst, int dim, int operation);†
画像を1列/1行のベクトルに縮退させる
返り値†
cvMinMaxLoc(IplImage *image, double* minVal, double* maxVal, CvPoint* minLocation, CvPoint* maxLocation, IplImage* mask);†
画像の中から最大と最小の位置を見つけてくる.
返り値†
- void型なので返り値はないが,下記の4つが得られる.
- minval:最小値
- maxval:最大値
- minLocation:最小値の座標
- maxLocation:最大値の座標
- cvReduceでは画像のProjectionを取ることで特徴量を計算する
- inputは行列(ベクトルも可)
- outputは列ベクトルか行ベクトル
- 当然inputとサイズの整合性が取れている必要がある.
- dimは基本的に-1でOK.
- 0を指定するとinputを1行ベクトルに縮退
- 1を指定するとinputを1列ベクトルに縮退
- -1を指定すると,inputとoutputのサイズから自動的に選択
- operationで縮退する際の処理方法を選択する
- CV_REDUCE_SUM:各行(列)の明度値の和
- CV_REDUCE_AVG:各行(列)の平均明度値
- CV_REDUCE_MAX:各行(列)の最大明度値
- CV_REDUCE_MIN:各行(列)の最小明度値
- MinMaxLocationでは,直接最小/最大の明度値を取得できる
- スケーリングする際に便利
- 4つの引数にはそれぞれNULLを指定可能
- 後半3つの引数は省略してNULLを指定可能
サンプルコード†
- すけーりんぐのさんぷる例(cvMinMaxLocを用いた例)
- スケーリングして正規化させるだけならばcvNormalizeを利用した方が便利
CvMat *input, *result_raw, *result_scaled;
double min, max;
// 適当な関数で処理をする
cvFunction(input, result_raw, some, parameters);
// cvMinMacLocで最大/最小値を取得
cvMinMaxLoc(result_raw, &min, &max);
// cvScaleで移動/伸縮させて格納
cvScale(result_raw, result_scaled, 1.0/(max-min), 1.0*(-min)/(max-min));
- 画像の列ごとの分散を計算する方法(cvReduceを用いた例)
CvMat *input, *average, *average2, *variance;
// 入力
input = read(適当);
// 平均,分散は高さ1の行ベクトル
average = cvCreateMat(1, width, CV_32FC1);
average2 = cvCreateMat(1, width, CV_32FC1);
variance = cvCreateMat(1, width, CV_32FC1);
// まずは列ごとの平均値
cvReduce(input, average, -1, CV_REDUCE_AVE);
// 平均値の2乗の計算
cvPow(average, average2, 2.0);
// 全体の2乗の計算
// inputを破壊したくなければコピーを用意すること
cvPow(input, input, 2.0);
// 2乗の平均値
// つまりは2乗の期待値
cvReduce(input, variance, -1, CV_REDUCE_AVE);
// 分散は2乗の期待値から期待値の2乗を引いたもの
cvSub(variance, average2, variance);
実体ファイル†
- cxcore/src/cxsumpixels.cpp (cvReduce)
- cxcore/src/cxminmaxloc.cpp (cvMinMaxLoc)
- cxcore/include/cxcore.h
ジャンル:OpenCV:OpenCV 1.0準拠