AND OR  

目的別に関数の説明をしていきます.

画像の複製 cvCloneImage()/cvCopy()

IplImageをコピーするには,

cvCloneImage() → 明示的なメモリ確保が不要
cvCopy() → 明示的なメモリ確保が必要

のどちらかを利用します.

IplImage* cvCloneImage(const IplImage* src);

src
   コピー元のIplImage.
  • cvCloneImage() の場合,明示的なメモリ確保は不要.
void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);

src
   コピー元の配列.
dst
   コピー先の配列.
mask
   8ビットシングルチャンネル配列の処理マスク.コピー先の配列の変更する要素を指定する.

コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズである必要があります.

  • cvCopy() の場合,明示的なメモリ確保が必要.

表色系の変換 cvCvtColor()

画像の表色系を変換します.

void cvCvtColor(const CvArr* src, CvArr* dst, int code);

src
   入力配列.
dst
   出力配列.
code
   変換元->変換先の表色系を表す定数を指定.
   ・CV_BGR2GRAY
   ・CV_BGR2HSV
   ・CV_BGR2HLS
   ・CV_BGR2Lab
   ・CV_BGR2YCrCb
   ・CV_BGR2XYZ
   ・CV_BGR2BGRA 等

エッジ検出 cvFilter2D()

画像とカーネルの畳み込みを行います.

void cvFilter2D(const CvArr* src, CvArr* dst,
                const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1));

src
   入力配列. 
dst
   出力配列. 
kernel
   畳み込み用のカーネル. 
anchor
   フィルタ対象ピクセルのカーネル内での相対位置.
   デフォルトはカーネルの中心を表す特別な値(-1,-1).

例えば

[ 1  1  1]
[ 1 -8  1]  ラプラシアンフィルタ
[ 1  1  1]

で畳み込む場合は

また,他のエッジ検出関数としてcvSobel()cvLaplace()cvCanny()関数が用意されています.
ただ,自前のカーネルで畳み込めるcvFilter2D()の利用を推奨します.

エッジ(edge)と輪郭(contour)は違うものなので注意してください.輪郭は物体の外形を表す線なので,面積,周囲長,円形度,重心などの特徴量を計算できますが,エッジ検出だけではできません.つまり,輪郭は閉じている(閉曲線)ということになります.

着目領域の指定 cvSetImageROI()

特定の領域だけに限定して処理したい場合,IplImageのROI(Region Of Interest:着目領域)を利用すると便利です.

void cvSetImageROI(IplImage* image, CvRect rect);

image
   画像ヘッダ. 
rect
   ROIを表す矩形. 
  • 画像の左下側にROIを設定し,その領域を上下反転させる.

ROIは矩形でしか指定できないので注意してください.

typedef struct CvRect {
  int x;  /* 矩形の左角の x 座標 */
  int y;  /* 矩形の上角(あるいは下角)の y 座標 */
  int width;  /* 矩形の幅 */
  int height;  /* 矩形の高さ */
} CvRect;

/* コンストラクタ */
/* 矩形の左上の座標(x,y)と幅・高さ(width,height)を指定する */
inline CvRect cvRect( int x, int y, int width, int height );

チャンネル分割 cvSplit()

マルチチャンネルの配列を複数のシングルチャンネルの配列に分割します.
RGB,HSV,L*a*b*などの色空間において各チャンネルの情報を個別に扱いたい時に利用します.

void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1,
             CvArr* dst2, CvArr* dst3);
#define cvCvtPixToPlane cvSplit

src
   入力配列. 
dst0...dst3
   出力チャンネル.

閾値処理 cvThreshold()

画像に閾値処理を行って2値化します.

void cvThreshold(const CvArr* src, CvArr* dst, double threshold,
                 double max_value, int threshold_type);

src
   入力配列 グレースケール.
dst
   出力配列.
threshold
   閾値.
max_value
   threshold_type が CV_THRESH_BINARY と CV_THRESH_BINARY_INV のときに使用する最大値. 
threshold_type
   閾値処理の種類
   ・CV_THRESH_BINARY
   ・CV_THRESH_BINARY_INV
   ・CV_THRESH_TRUNC
   ・CV_THRESH_TOZERO
   ・CV_THRESH_TOZERO_INV