画像から最大の明度,最小の明度などの特徴量を抽出する

void cvReduce( IplImage* src, IplImage* dst, int dim, int operation);

画像を1列/1行のベクトルに縮退させる

引数

  • src:IplImage*型の入力画像.CvMat*型も可
  • dst:IplImage*型の入力画像.CvMat*型も可
  • dim:int型の縮退させる方向
  • operation:int型の縮退方法

返り値

  • void型なのでなし

cvMinMaxLoc(IplImage *image, double* minVal, double* maxVal, CvPoint* minLocation, CvPoint* maxLocation, IplImage* mask);

画像の中から最大と最小の位置を見つけてくる.

引数

  • image:IplImage*型の画像.CvMat*型の行列も可能.
  • minval:double*型の最小値.
  • maxval:double*型の最大値.
  • maxLocation:CvPoint*型の最大値の座標.
  • maxLocation:CvPoint*型の最小値の座標.
  • mask:IplImage*型の処理対象マスク.CvMat*型でも可能.

返り値

  • 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準拠


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-27 (木) 11:41:11 (2734d)