CV リファレンス マニュアル
- 画像処理(Image Processing)
- 勾配,エッジ,コーナー(Gradients, Edges and Corners)
- サンプリング,補間,幾何変換(Sampling, Interpolation and Geometrical Transforms)
- モルフォロジー演算(Morphological Operations)
- フィルタと色変換(Filters and Color Conversion)
- ピラミッドとその応用(Pyramids and the Applications)
- 画像分割,領域結合,輪郭検出(Image Segmentation, Connected Components and Contour Retrieval)
- 画像と形状のモーメント(Image and Contour Moments)
- 特殊な画像変換(Special Image Transforms)
- ヒストグラム(Histograms)
- マッチング(Matching)
- 構造解析(Structural Analysis)
- モーション解析と物体追跡(Motion Analysis and Object Tracking)
- パターン認識(Pattern Recognition)
- カメラキャリブレーションと3次元再構成(Camera Calibration and 3D Reconstruction)
- 参考文献
画像処理(Image Processing)
注釈:
この章では画像処理及び解析のための関数について述べる.ほとんどの関数はピクセルの2次元配列に対して実行される.OpenCVでは配列を「画像」として取り扱う.しかしその配列はIplImage形式である必要はなく,CvMat形式またはCvMatND形式でもよい.
サンプリング,補間,幾何変換(Sampling, Interpolation and Geometrical Transforms)
SampleLine
ラスタ表現の線分を構成する点をサンプリングする
int cvSampleLine( const CvArr* image, CvPoint pt1, CvPoint pt2,
void* buffer, int connectivity=8 );
- image
- 線分をサンプリングするための入力画像.
- pt1
- 線分の始点.
- pt2
- 線分の終点.
- buffer
- 線分上の点を保存するためのバッファ(保存するための十分なサイズとして8近傍隣接による線分検出の場合,max( |pt2.x-pt1.x|+1, |pt2.y-pt1.y|+1 )が必要で ,また4近傍隣接による線分検出の場合,|pt2.x-pt1.x|+|pt2.y-pt1.y|+1が必要).
- connectivity
- 線分の接続性.4 または 8.
関数 cvSampleLine は,ラインイテレータを使った特別なケースの実装である. この関数は pt1 と pt2(終点を含む)間にあるすべての画像点を読み出し,それらをバッファに保存する.
GetRectSubPix
矩形領域のピクセル値を画像からサブピクセル精度で取得する(画像の並進移動を行なう)
void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center );
- src
- 入力画像.
- dst
- 抽出された矩形.
- center
- 入力画像中にある抽出された矩形中心の浮動小数点型座標.中心は画像中になければならない.
関数 cvGetRectSubPix は,src から以下のようにしてピクセル値を取得する.
dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)
ここで非整数値座標のピクセル値は,バイリニア補間により得られる. マルチチャンネル画像の各チャンネルは独立して処理される. 矩形の中心は画像中に存在する必要があるが,矩形全体では,その一部が隠れている(画像領域の外にある)かもしれない. このような場合は,画像境界の外側に存在するピクセルの値を得るために,複製境界モード (replication border mode) が使われる.
GetQuadrangleSubPix
四角形領域のピクセル値を画像からサブピクセル精度で取得する(画像の回転+並進移動を行なう)
void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
- src
- 入力画像.
- dst
- 抽出された四角形.
- map_matrix
- 2 × 3 の変換行列 [A|b] (以下の説明を参照).
関数 cvGetQuadrangleSubPix は,以下のようにして src からサブピクセル精度でピクセル値を取得し,結果を dst に保存する.
dst(x, y)= src( A11x'+A12y'+b1, A21x'+A22y'+b2), ここで A と b は map_matrix より得られる. | A11 A12 b1 | map_matrix = | | | A21 A22 b2 |, x'=x-(width(dst)-1)*0.5, y'=y-(height(dst)-1)*0.5
ここで,非整数値座標のピクセル値 A•(x,y)T+b は,バイリニア補間により得られる. 画像境界の外側に存在するピクセルの値を必要とする場合には,値を生成するために複製境界モード (replication border mode) を用いる. マルチチャンネル画像の全てのチャンネルはそれぞれ独立して処理される.
Resize
画像のサイズ変更を行う
void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
- src
- 入力画像.
- dst
- 出力画像.
- interpolation
- 補間方法.
- CV_INTER_NN - 最近隣接補間
- CV_INTER_LINEAR - バイリニア補間 (デフォルト)
- CV_INTER_AREA - ピクセル領域の関係を用いてリサンプリングする.画像縮小の際は,モアレの無い処理結果を得ることができる手法である.拡大の際は,CV_INTER_NN と同様
- CV_INTER_CUBIC - バイキュービック補間
関数 cvResize は, dst のサイズに合うように,画像 src のサイズを変更する. ROI が設定されているならば,ROI も同様にサイズ変更する.
WarpAffine
画像のアフィン変換を行う
void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
CvScalar fillval=cvScalarAll(0) );
- src
- 入力画像.
- dst
- 出力画像.
- map_matrix
- 2×3 変換行列.
- flags
- 補間方法(CvResizeを参照)と,以下に示すオプションフラグの組み合わせ.
- CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める.対応ピクセルが入力画像外であるようなピクセルである場合は, fillvalがセットされる.
- CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので,直接ピクセル補間に用いることができる.これがセットされていない場合,この関数は map_matrix を使って逆変換を計算する.
- fillval
- 対応の取れない点に対して与える値.
関数 cvWarpAffine は入力画像を与えられた行列を用いて以下のように変換する.
dst(x,y)<-src(x,y) (x,y)T=map_matrix•(x,y,1)T+b (CV_WARP_INVERSE_MAP がセットされていない場合) (x, y)T=map_matrix•(x,y&apos,1)T+b (それ以外の場合)
この関数は cvGetQuadrangleSubPix に類似しているが,厳密には同じではない. cvWarpAffine は入力画像と出力画像のデータ型が同じである必要があり,オーバーヘッドも大きい(そのためサイズの小さい画像には適していない).そして出力画像の一部を変換せずに残すことができる. 一方,cvGetQuadrangleSubPix は8ビット画像から矩形を取り出し,浮動小数点型バッファに保存するためオーバーヘッドが少ない.そして常に出力画像全体が変換される.
疎な点集合を変換するときは,cxcore にある cvTransform を使用すべきである.
GetAffineTransform
3点とそれぞれに対応する点からアフィン変換を計算する
CvMat* cvGetAffineTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst,
CvMat* map_matrix );
- src
- 入力(変換前)画像内に存在する三角形の3つの頂点座標.
- dst
- 出力(変換後)画像内に存在するsrcに対応した三角形の三つの頂点座標.
- map_matrix
- 出力される 2×3の行列へのポインタ.
関数 cvGetAffineTransform は以下のようなアフィン変換行列を求める.
(x'i,y'i)T=map_matrix•(xi,yi,1)T
ここで dst(i)=(x'i,y'i), src(i)=(xi,yi), i=0..2.
2DRotationMatrix
2次元回転のアフィン行列を計算する
CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle,
double scale, CvMat* map_matrix );
- center
- 入力画像内の回転中心
- angle
- 度(degree)単位の回転角度.正の値は反時計方向の回転を意味する(座標原点は左上にあると仮定).
- scale
- 等方性スケーリング係数(x,y方向とも同じ係数 scale を使う)
- map_matrix
- 出力される 2×3の行列へのポインタ.
関数 cv2DRotationMatrix は以下の行列を求める.
[ α β | (1-α)*center.x - β*center.y ] [ -β α | β*center.x + (1-α)*center.y ] ここで α=scale*cos(angle), β=scale*sin(angle)
この変換では回転中心は動かない. ユーザーがこれを意図していない場合は,並進を調整する必要がある.
WarpPerspective
画像の透視変換を行う
void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
CvScalar fillval=cvScalarAll(0) );
- src
- 入力画像.
- dst
- 出力画像.
- map_matrix
- 3×3 の変換行列.
- flags
- 補間方法(CvResizeを参照)と,以下に示すオプションフラグの組み合わせ.
- CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める.対応ピクセルが入力画像外であるようなピクセルである場合は, fillvalがセットされる.
- CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので,直接ピクセル補間に用いることができる.これがセットされていない場合,この関数は map_matrix を使って逆変換を計算する.
- fillval
- 対応の取れない点に対して与える値.
関数 cvWarpPerspective は,与えられた行列を用いて,以下のように入力画像を変換する.
dst(x,y)<-src(x,y) (t•x,t•y,t)T=map_matrix•(x,y,1)T+b (CV_WARP_INVERSE_MAP がセットされていない場合) (t•x, t•y, t)T=map_matrix•(x,y&apos,1)T+b (それ以外の場合)
疎な点集合を変換するときは,cxcore にある cvPerspectiveTransform を使用すべきである.
GetPerspectiveTransform
4点とそれぞれに対応する点を用いて透視変換行列を求める
CvMat* cvGetPerspectiveTransform( const CvPoint2D32f* src, const CvPoint2D32f* dst,
CvMat* map_matrix );
#define cvWarpPerspectiveQMatrix cvGetPerspectiveTransform
- src
- 入力画像中の矩形の4頂点の座標.
- dst
- 出力画像中の対応する矩形の4頂点の座標.
- map_matrix
- 3×3 の出力行列へのポインタ.
関数 cvGetPerspectiveTransform は以下のように透視変換行列を求める.
(ti•x'i,ti•y'i,ti)T=map_matrix•(xi,yi,1)T
ここで dst(i)=(x'i,y'i), src(i)=(xi,yi), i=0..3.
Remap
画像に対して幾何変換を行う
void cvRemap( const CvArr* src, CvArr* dst,
const CvArr* mapx, const CvArr* mapy,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,
CvScalar fillval=cvScalarAll(0) );
- src
- 入力画像.
- dst
- 出力画像.
- mapx
- x座標マップ (32fC1 フォーマットの画像).
- mapy
- y座標マップ (32fC1 フォーマットの画像).
- flags
- 補間方法(CvResizeを参照)と,以下に示すオプションフラグの組み合わせ.
- CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める.対応ピクセルが入力画像外であるようなピクセルである場合は, fillvalがセットされる.
- fillval
- 対応の取れない点に対して与える値.
関数 cvRemap は,指定されたマップを用いて入力画像を以下のように変換する.
dst(x,y)<-src(mapx(x,y),mapy(x,y))
他の幾何変換と同様,非整数座標値を持つピクセルを抽出するために,ユーザによって指定された補間方法が用いられる.
LogPolar
画像を対数極座標(Log-Polar)空間に再マッピングする
void cvLogPolar( const CvArr* src, CvArr* dst,
CvPoint2D32f center, double M,
int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS );
- src
- 入力画像.
- dst
- 出力画像.
- center
- 出力精度が最大となるような変換の中心座標.
- M
- スケーリング係数の大きさ.以下を参照.
- flags
- 補間方法(CvResizeを参照)と,以下に示すオプションフラグの組み合わせ.
- CV_WARP_FILL_OUTLIERS - 出力画像の全ピクセルの値を埋める.対応ピクセルが入力画像外であるようなピクセルである場合は, 0がセットされる.
- CV_WARP_INVERSE_MAP - このフラグは map_matrixが出力画像から入力画像への逆変換のための行列であることを意味するので,直接ピクセル補間に用いることができる.これがセットされていない場合,この関数は map_matrix を使って逆変換を計算する.
関数 cvLogPolar は入力画像を以下のように変換する.
順変換(CV_WARP_INVERSE_MAP がセットされていない)の場合. dst(phi,rho)<-src(x,y) 逆変換(CV_WARP_INVERSE_MAP がセットされている)の場合. dst(x,y)<-src(phi,rho), ここで rho=M*log(sqrt(x2+y2)) phi=atan(y/x)
この関数は人間の網膜をモデル化したものであり,オブジェクトトラッキング等のための高速なスケーリングと,回転に不変なテンプレートマッチングに用いることができる.
(例)Log-polar 変換
#include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage* src; if( argc == 2 && (src=cvLoadImage(argv[1],1) != 0 ) { IplImage* dst = cvCreateImage( cvSize(256,256), 8, 3 ); IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 ); cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ); cvLogPolar( dst, src2, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP ); cvNamedWindow( "log-polar", 1 ); cvShowImage( "log-polar", dst ); cvNamedWindow( "inverse log-polar", 1 ); cvShowImage( "inverse log-polar", src2 ); cvWaitKey(); } return 0; }
以下に opencv/samples/c/fruits.jpg に対して,この関数を実行した場合の出力結果を示す.