CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
配列操作(Operations on Arrays)
離散変換(Discrete Transforms)
DFT
1次元あるいは2次元浮動小数点型配列に対して離散フーリエ変換(DFT),逆離散フーリエ変換(IDFT)を行う
#define CV_DXT_FORWARD 0
#define CV_DXT_INVERSE 1
#define CV_DXT_SCALE 2
#define CV_DXT_ROWS 4
#define CV_DXT_INV_SCALE (CV_DXT_SCALE|CV_DXT_INVERSE)
#define CV_DXT_INVERSE_SCALE CV_DXT_INV_SCALE
void cvDFT( const CvArr* src, CvArr* dst, int flags, int nonzero_rows=0 );
- src
- 入力配列(実数または複素数).
- dst
- 入力配列と同じサイズ・タイプの出力配列.
- flags
- 変換フラグ.以下の値の組み合わせ.
CV_DXT_FORWARD - 1次元または2次元の順変換を行う.結果のスケーリングは行わない.
CV_DXT_INVERSE - 1次元または2次元の逆変換を行う.結果のスケーリングは行わない. CV_DXT_FORWARD と CV_DXT_INVERSE は,もちろん同時には指定できない.
CV_DXT_SCALE - 結果を配列要素数で割り,スケーリングする.通常は CV_DXT_INVERSE と同時に用いる.ショートカットとして CV_DXT_INV_SCALE を用いても良い.
CV_DXT_ROWS - 入力配列のそれぞれの行に対して独立に,順変換あるいは逆変換を行う. このフラグは複数のベクトルの同時変換を許可し,オーバーヘッド(一つの計算の何倍も大きくなることもある)を減らすためや,3次元以上の高次元に対して変換を行うために使用される. - nonzero_rows
- 入力配列の非0である行の数(2次元順変換の場合),あるいは出力配列で注目する行の数(2次元逆変換の場合). この値が負,0,あるいは行の数より大きい場合は無視される. このパラメータにより,DFTを用いて2次元の畳み込みや相関演算を行う際の計算速度が向上する.詳しくは,以下のサンプルを参照.
関数 cvDFT は,以下に示すように1次元あるいは2次元浮動小数点型配列の順変換・逆変換を行う.
N個の要素を持つ1次元ベクトルのフーリエ変換: y = F(N) • x, ここで, F(N)jk=exp(-i • 2Pi • j • k/N),i=sqrt(-1) N個の要素を持つ1次元ベクトルの逆フーリエ変換: x'= (F(N))-1 • y = conj(F(N)) • y x = (1/N) • x M × N個の要素を持つ2次元ベクトルのフーリエ変換: Y = F(M)• X •F(N) M × N個の要素を持つ2次元ベクトルの逆フーリエ変換: X'= conj(F(M))• Y • conj(F(N)) X = (1/(M • N)) • X'
IPLで用いられる,実数(シングルチャンネル)packedフォーマットのデータが,フーリエ変換の結果あるいは逆フーリエ変換の入力を表現するために用いられる.
Re Y0,0 Re Y0,1 Im Y0,1 Re Y0,2 Im Y0,2 ... Re Y0,N/2-1 Im Y0,N/2-1 Re Y0,N/2 Re Y1,0 Re Y1,1 Im Y1,1 Re Y1,2 Im Y1,2 ... Re Y1,N/2-1 Im Y1,N/2-1 Re Y1,N/2 Im Y1,0 Re Y2,1 Im Y2,1 Re Y2,2 Im Y2,2 ... Re Y2,N/2-1 Im Y2,N/2-1 Im Y2,N/2 ............................................................................................ Re YM/2-1,0 Re YM-3,1 Im YM-3,1 Re YM-3,2 Im YM-3,2 ... Re YM-3,N/2-1 Im YM-3,N/2-1 Re YM-3,N/2 Im YM/2-1,0 Re YM-2,1 Im YM-2,1 Re YM-2,2 Im YM-2,2 ... Re YM-2,N/2-1 Im YM-2,N/2-1 Im YM-2,N/2 Re YM/2,0 Re YM-1,1 Im YM-1,1 Re YM-1,2 Im YM-1,2 ... Re YM-1,N/2-1 Im YM-1,N/2-1 Im YM-1,N/2
注釈:N が偶数なら最終列が存在し,M が偶数なら最終行が存在する.
1次元実数変換の場合,結果は上の行列の1行目のようになる.
DFTを用いた2次元畳み込みの計算CvMat* A = cvCreateMat( M1, N1, CV_32F ); CvMat* B = cvCreateMat( M2, N2, A->type ); // 畳み込み結果の一部(abs(M2-M1)+1×abs(N2-N1)+1)のみを持つ可能性もある CvMat* conv = cvCreateMat( A->rows + B->rows - 1, A->cols + B->cols - 1, A->type ); // AとBを初期化 ... int dft_M = cvGetOptimalDFTSize( A->rows + B->rows - 1 ); int dft_N = cvGetOptimalDFTSize( A->cols + B->cols - 1 ); CvMat* dft_A = cvCreateMat( dft_M, dft_N, A->type ); CvMat* dft_B = cvCreateMat( dft_M, dft_N, B->type ); CvMat tmp; // Aを dft_Aにコピーし,dft_A の右部残りを0で埋める cvGetSubRect( dft_A, &tmp, cvRect(0,0,A->cols,A->rows)); cvCopy( A, &tmp ); cvGetSubRect( dft_A, &tmp, cvRect(A->cols,0,dft_A->cols - A->cols,A->rows)); cvZero( &tmp ); // 以下のcvDFT()では,パラメータnonzero_rowsを用いているため, // dft_Aの下部を0で埋める必要はない cvDFT( dft_A, dft_A, CV_DXT_FORWARD, A->rows ); // 2番目の配列に対しても同様に繰り返す cvGetSubRect( dft_B, &tmp, cvRect(0,0,B->cols,B->rows)); cvCopy( B, &tmp ); cvGetSubRect( dft_B, &tmp, cvRect(B->cols,0,dft_B->cols - B->cols,B->rows)); cvZero( &tmp ); // 以下のcvDFT()では,パラメータnonzero_rowsを用いているため, // dft_Bの下部を0で埋める必要はない cvDFT( dft_B, dft_B, CV_DXT_FORWBRD, B->rows ); cvMulSpectrums( dft_A, dft_B, dft_A, 0 /* 畳み込みではなく相関を得るためには CV_DXT_MUL_CONJ を指定する */ ); cvDFT( dft_A, dft_A, CV_DXT_INV_SCALE, conv->rows ); // 上部のみを計算する cvGetSubRect( dft_A, &tmp, cvRect(0,0,conv->cols,conv->rows) ); cvCopy( &tmp, conv );
GetOptimalDFTSize
与えられたベクトルのサイズに対する最適なDFTのサイズを返す
int cvGetOptimalDFTSize( int size0 );
- size0
- ベクトルのサイズ.
関数 cvGetOptimalDFTSize は,size0以上の最小値N を返し, 得られたサイズNのベクトルに対するDFTは高速に計算できる. 現在の実装では,ある p, q, r について,N=2p×3q×5r.
size0 が非常に大きな値(INT_MAX に非常に近い)の場合,この関数は負の値を返す.
MulSpectrums
二つのフーリエスペクトラムの要素ごとの乗算を行う
void cvMulSpectrums( const CvArr* src1, const CvArr* src2, CvArr* dst, int flags );
- src1
- 1番目の入力配列.
- src2
- 2番目の入力配列.
- dst
- 入力配列と同じタイプ・サイズの出力配列.
- flags
- 以下の値の組み合わせ.
CV_DXT_ROWS - 配列の各行を個別のスペクトラムとして扱う (cvDFT のパラメータを参照).
CV_DXT_MUL_CONJ - 乗算の前に2番目の入力配列の共役を計算する
関数 cvMulSpectrums は,実フーリエ変換あるいは複素フーリエ変換の結果として得られた二つのCCS-packed行列,または複素行列の要素ごとの乗算を行う.
この関数とcvDFTを共に用いることで,二つの配列の高速な畳み込み計算が可能である.
DCT
1次元あるいは2次元浮動小数点型配列の順方向・逆方向離散コサイン変換を行う
#define CV_DXT_FORWARD 0
#define CV_DXT_INVERSE 1
#define CV_DXT_ROWS 4
void cvDCT( const CvArr* src, CvArr* dst, int flags );
- src
- 入力配列(実数の1次元あるいは2次元配列).
- dst
- 入力と同じサイズ・タイプの出力配列.
- flags
- 変換フラグ.以下の値の組み合わせ.
CV_DXT_FORWARD - 1次元あるいは2次元の順変換.
CV_DXT_INVERSE - 1次元あるいは2次元の逆変換.
CV_DXT_ROWS - 入力配列のそれぞれの行に対して,独立に順変換あるいは逆変換を行う. このフラグは複数ベクトルの同時変換を許可し, オーバーヘッド(一つの計算の何倍も大きくなることもある)を減らすためや,3次元以上の高次元に対して変換を行うために使用される.
関数 cvDCT は以下のように,1次元あるいは2次元浮動小数点型配列に対して順方向・逆方向離散コサイン変換を行う.
N個の要素を持つ1次元ベクトルの順方向コサイン変換: y = C(N)•x, ここで C(N)jk=sqrt((j==0?1:2)/N)•cos(Pi•(2k+1)•j/N) N個の要素を持つ1次元ベクトルの逆方向コサイン変換: x = (C(N))-1•y = (C(N))T•y M×N 個の要素を持つ2次元ベクトルの順方向コサイン変換: Y = (C(M))•X•(C(N))T M×N 個の要素を持つ2次元ベクトルの逆方向コサイン変換: X = (C(M))T•Y•C(N)