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形式でもよい.
フィルタと色変換(Filters and Color Conversion)
Smooth
指定された方法で画像の平滑化を行う
void cvSmooth( const CvArr* src, CvArr* dst,
int smoothtype=CV_GAUSSIAN,
int param1=3, int param2=0, double param3=0, double param4=0 );
- src
- 入力画像.
- dst
- 出力画像.
- smoothtype
- 平滑化の方法
- CV_BLUR_NO_SCALE (スケーリング無しの単純平滑化) - ピクセル の param1×param2 隣接の総和. 隣接サイズが変化する可能性のある場合,関数 cvIntegral を用いて,インテグラルイメージをあらかじめ計算しておくという方法がある.
- CV_BLUR (単純平滑化[simple blur]) - ピクセルの param1×param2 隣接の総和を計算した後,1/(param1•param2)によってスケーリングする.
- CV_GAUSSIAN (ガウシアン平滑化[Gaussian blur]) - 画像とサイズ param1×param2 のガウシアンカーネルの畳み込み.
- CV_MEDIAN (中央値平滑化[median blur]) - param1×param1 隣接(隣接形状が正方形)の中央値の取得.
- CV_BILATERAL (エッジ保持平滑化フィルタ[bilateral filter]) - 色(輝度値)についてsigma=param1 と 領域(距離)についてsigma=param2 を持つ3×3のバイラテラルフィルタを適用する.バイラテラルフィルタに関する情報は http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html を参照.
- param1
- 平滑化処理のパラメータ1.
- param2
- 平滑化処理のパラメータ2.スケーリング有り/無しの単純平滑またはガウシアン平滑化の場合,param2 が0のときは param1 にセットされる.
- param3
- ガウシアン平滑化 の場合,このパラメータがガウシアンsigma(標準偏差)を示す.0の場合,以下のようにカーネルサイズから計算する.
sigma = (n/2 - 1)*0.3 + 0.8,ここで 水平カーネルの場合は,n=param1 垂直カーネルの場合は,n=param2
小さいサイズのカーネル (3×3 から 7×7 まで) の場合は標準偏差を用いる方がパフォーマンスが良い. param1 と param2が 0 で,param3 が 非0の場合, カーネルサイズはsigmaより計算される(十分な精度を得るため). - param4
- 非正方形のガウシアンカーネルを使用する場合,垂直方向に異なるsigma 値(param3と違う値)指定するために用いられる.
関数 cvSmooth は,手法を指定して画像の平滑化を行う. 各手法は,以下に示すような特徴や制限を持つ.
スケーリング無しの平滑化は,シングルチャンネル画像を対象とし,8ビットフォーマットのデータを16ビットフォーマットへの累積(cvSobel や cvLaplace と同様),32ビット浮動小数点の32ビット浮動小数点への累積,をサポートしている.
単純平滑化とガウシアン平滑化は,1 あるいは 3チャンネル,8ビットと32ビット浮動小数点画像をサポートしている. これら2つの手法は,インプレースモードでの処理が可能である
メディアンフィルタとバイラテラルフィルタは,1あるいは 3チャンネル,8ビット画像をサポートしている.インプレースモードでの処理は不可能である.
Filter2D
画像とカーネルの畳み込みを行う
void cvFilter2D( const CvArr* src, CvArr* dst,
const CvMat* kernel,
CvPoint anchor=cvPoint(-1,-1));
- src
- 入力画像.
- dst
- 出力画像.
- kernel
- 畳み込み用のカーネルで,シングルチャンネルの浮動小数点型行列.異なるチャンネルに対して異なるカーネルを適用する場合は, cvSplit を用いてそれぞれのカラープレーンを分離し,それぞれに対して処理を行う.
- anchor
- フィルタ対象ピクセルのカーネル内での相対位置を表す,カーネルのアンカー.デフォルトはカーネルの中心を表す特別な値(-1,-1)である.
関数 cvFilter2D は,入力画像に対して任意の線形フィルタを適用する. インプレース処理がサポートされている.フィルタ範囲が部分的に画像より外に出てしまった場合は,画像内の近隣ピクセルから範囲外のピクセル値を補間する.
CopyMakeBorder
画像をコピーし,その周りに境界線をつける
void cvCopyMakeBorder( const CvArr* src, CvArr* dst, CvPoint offset,
int bordertype, CvScalar value=cvScalarAll(0) );
- src
- 入力画像.
- dst
- 出力画像.
- offset
- 入力画像(あるいはROI)がコピーされる出力画像内矩形領域の左上角座標 (左下に原点を持つ画像の場合は,左下角座標).矩形のサイズは,入力画像(あるいはROI)のサイズに等しい.
- bordertype
- コピーされた矩形領域の周りに生成する境界線のタイプ.
IPL_BORDER_CONSTANT - 境界はこの関数の最後のパラメータとして渡された定数 value で埋められる.
IPL_BORDER_REPLICATE - 画像の最も上/下の行と最も左/右の列(画像領域の一番外側の値)を用いて境界線を生成する.
(IPLでサポートされていた IPL_BORDER_REFLECT と IPL_BORDER_WRAP は現在はサポートされていない). - value
- bordertype=IPL_BORDER_CONSTANT の場合は境界を埋める値.
関数 cvCopyMakeBorder は,入力の2次元配列を出力配列にコピーし,コピーされた領域の周りに指定したタイプの境界線を生成する. 特定のアルゴリズム内に組み込まれたボーダータイプとは別のボーダータイプをエミュレートする必要がある場合に,この関数が役立つ. 例えば,(ユーザは,0,1,255などで埋められたボーダーを必要とするかもしれないが)モルフォロジー関数やOpenCVのフィルタ関数の大半は, 内部的に複製ボーダータイプ(IPL_BORDER_REPLICATE)を利用する.
Integral
任意の矩形領域の画素値の総和を計算する
void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tilted_sum=NULL );
- image
- 入力画像,W×H,8ビットあるいは浮動小数点(32fか64f)画像.
- sum
- インテグラルイメージ(integral image),W+1×H+1,32ビット整数型あるいは倍精度浮動小数点型(64f).
- sqsum
- 各ピクセル値を2乗したインテグラルイメージ,W+1×H+1,倍精度浮動小数点型(64f).
- tilted_sum
- 45度回転させた入力画像のインテグラルイメージ,W+1×H+1,sumと同じデータフォーマット.
関数 cvIntegral は入力画像に対して,以下に示すような画素値のインテグラルイメージを計算する.
sum(X,Y)=sumx<X,y<Yimage(x,y) sqsum(X,Y)=sumx<X,y<Yimage(x,y)2 tilted_sum(X,Y)=sumy<Y,abs(x-X)<yimage(x,y)
このようなインテグラルイメージを用いて,画像中の任意の矩形領域(あるいは45度回転した矩形領域)の画素値の総和,平均,標準偏差を一定の時間で計算する. 以下に例を示す.
sumx1<=x<x2,y1<=y<y2image(x,y)=sum(x2,y2)-sum(x1,y2)-sum(x2,y1)+sum(x1,x1)
可変ウィンドウサイズでの,高速な平滑化や高速な相関演算などが可能になる.マルチチャンネルの画像では,各チャンネルの総和はそれぞれ独立に計算される.
CvtColor
画像の色空間を変換する
void cvCvtColor( const CvArr* src, CvArr* dst, int code );
- src
- 入力画像,8ビット(8u),16ビット(16u),あるいは単精度浮動小数点型(32f).
- dst
- 出力画像,入力画像と同じデータタイプ.チャンネル数は違うこともある.
- code
- CV_<src_color_space>2<dst_color_space> の定数を用いて色空間の変換を指定 (以下参照).
関数 cvCvtColor は,入力画像の色空間を変換する. この関数は IplImage ヘッダ部の colorModel ,channelSeq フィールドを無視するため,入力画像の色空間は正しく指定する必要がある (RGB空間の場合は,チャンネル順にも注意する.例えば BGR は B0 G0 R0 B1 G1 R1 ... のように並ぶ24ビットフォーマットであり,RGB は R0 G0 B0 R1 G1 B1 ... のように並ぶ24ビットフォーマットである).
通常の R,G,B チャンネルのレンジは,以下の通り.
- 8ビット画像では 0..255
- 16ビット画像では 0..65535
- 浮動小数点型画像では 0..1
関数は以下のような変換が可能である.
- RGB空間内での変換: アルファチャンネルの追加または削除,チャンネル順の反転,16ビットRGBカラー(R5:G6:B5 or R5:G5:B5)へ,または16ビットRGBカラーからの変換,以下の式を用いてグレースケールへ,またはグレースケールからの変換,等
RGB[A]->Gray: Y<-0.299*R + 0.587*G + 0.114*B Gray->RGB[A]: R<-Y G<-Y B<-Y A<-0
- RGB<=>CIE XYZ(Rec709仕様,D65白色点)(CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB):
|X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| |R| | 3.240479 -1.53715 -0.498535| |X| |G| <- |-0.969256 1.875991 0.041556|*|Y| |B| | 0.055648 -0.204043 1.057311| |Z| X, Y, Z はレンジ全体をカバーする (浮動小数点型画像の場合,Z は1を超える場合がある).
- RGB<=>YCrCb JPEG (YCCとも呼ばれる)(CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB):
Y <- 0.299*R + 0.587*G + 0.114*B Cr <- (R-Y)*0.713 + delta Cb <- (B-Y)*0.564 + delta R <- Y + 1.403*(Cr - delta) G <- Y - 0.344*(Cr - delta) - 0.714*(Cb - delta) B <- Y + 1.773*(Cb - delta), { 8ビット画像の場合 128 ここで delta = { 16ビット画像の場合 32768 { 浮動小数点型画像の場合 0.5 Y, Cr, Cb はレンジ全体をカバーする.
- RGB<=>HSV (CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB)
// 8ビットあるいは16ビット画像の場合, // R, G, B は 0..1 にスケーリングされた浮動小数点型に変換される. V <- max(R,G,B) V≠0 の場合,S <- (V-min(R,G,B))/V,それ以外の場合 0 V=R の場合, (G - B)*60/S V=G の場合,H <- 120+(B - R)*60/S V=B の場合, 240+(R - G)*60/S H<0 の場合, H<-H+360 出力は 0≤V≤1, 0≤S≤1, 0≤H≤360. 値はこのあと,以下のようにして出力のデータタイプに変換される. 8ビット画像 V <- V*255, S <- S*255, H <- H/2 (0..255の範囲) 16ビット画像(現在はサポートしていない) V <- V*65535, S <- S*65535, H <- H 32ビット画像 H, S, V はそのまま
- RGB<=>HLS (CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB)
// 8ビットあるいは16ビット画像の場合, // R, G, B は 0..1 にスケーリングされた浮動小数点型に変換される. Vmax <- max(R,G,B) Vmin <- min(R,G,B) L <- (Vmax + Vmin)/2 L < 0.5の場合,S <- (Vmax - Vmin)/(Vmax + Vmin) L ≥ 0.5の場合, (Vmax - Vmin)/(2 - (Vmax + Vmin)) Vmax=R の場合, (G - B)*60/S Vmax=G の場合,H <- 120+(B - R)*60/S Vmax=B の場合, 240+(R - G)*60/S H<0 の場合, H<-H+360 出力は 0≤L≤1, 0≤S≤1, 0≤H≤360. 値はこのあと,以下のようにして出力のデータタイプに変換される. 8ビット画像 L <- L*255, S <- S*255, H <- H/2 16ビット画像(現在サポートしていない) L <- L*65535, S <- S*65535, H <- H 32ビット画像 H, L, S はそのまま
- RGB<=>CIE L*a*b* (CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB)
//8ビットあるいは16ビット画像の場合, // R, G, B は 0..1 にスケーリングされた浮動小数点型に変換される. // R,G,B を CIE XYZ に変換する |X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| X <- X/Xn, Xn = 0.950456 Z <- Z/Zn, Zn = 1.088754 Y>0.008856 の場合, L <- 116*Y1/3 Y<=0.008856 の場合,L <- 903.3*Y a <- 500*(f(X)-f(Y)) + delta b <- 200*(f(Y)-f(Z)) + delta t>0.008856 の場合, f(t)=t1/3 t<=0.008856の場合,f(t)=7.787*t+16/116 for t<=0.008856 8ビット画像の場合, delta = 128 浮動小数点型画像の場合 0 出力は,0≤L≤100, -127≤a≤127, -127≤b≤127 値はこのあと,以下のようにして出力のデータタイプに変換される. 8ビット画像 L <- L*255/100, a <- a + 128, b <- b + 128 16ビット画像は,現在サポートしていない 32ビット画像 L, a, b はそのまま
- RGB<=>CIE L*u*v* (CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB)
// 8ビットあるいは16ビット画像の場合 // R, G, B は 0..1 にスケーリングされた浮動小数点フォーマットに変換される. // R,G,B を CIE XYZ に変換する |X| |0.412453 0.357580 0.180423| |R| |Y| <- |0.212671 0.715160 0.072169|*|G| |Z| |0.019334 0.119193 0.950227| |B| Y> 0.008856 の場合,L <- 116*Y1/3-16 Y<=0.008856 の場合,L <- 903.3*Y u' <- 4*X/(X + 15*Y + 3*Z) v' <- 9*Y/(X + 15*Y + 3*Z) u <- 13*L*(u' - un), where un=0.19793943 v <- 13*L*(v' - vn), where vn=0.46831096 出力は,0≤L≤100, -134≤u≤220, -140≤v≤122 値はこのあと,以下のようにして出力のデータタイプに変換される 8ビット画像 L <- L*255/100, u <- (u + 134)*255/354, v <- (v + 140)*255/256 16ビット画像は現在サポートしていない 32ビット画像 L, u, v はそのまま
上に示したRGBと各種の色空間との変換式は,Web上の複数の情報から得ている.特に Charles Poynton のサイトColor Space Conversions ([Ford98]) からは多くの情報を得た. - Bayer=>RGB (CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR,
CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB)Bayer パターンは CCD カメラや CMOS カメラで幅広く使われている. R,G,B 各ピクセルがこのように交互に配置された(ある特定の構造を持つセンサ)単一のプレーンを用いることで,カラー画像を得ることができる.
R
G
R
G
R
G
B
G
B
G
R
G
R
G
R
G
B
G
B
G
R
G
R
G
R
G
B
G
B
G
出力される各ピクセルのRGB値は,同色のピクセルの1, 2 あるいは 4隣接を用いた補間により求める.上に示したパターンには,パターンの一つのピクセルを左シフト,さらに(あるいは)一つのピクセルを上にシフトすることによって得られる様々な変形タイプが存在する. 変換定数CV_BayerC1C22{BGR|RGB} における二つの文字 C1 と C2 は特定のパターンのタイプを示す − これらは,それぞれ 2番目の行,2番目と3番目の列の要素である. 例として,上に示したパターンは,一般的な "BG" タイプである.
Threshold
配列の要素に対して一定値での閾値処理を行う
void cvThreshold( const CvArr* src, CvArr* dst, double threshold,
double max_value, int threshold_type );
- src
- 入力配列 (シングルチャンネル,8ビット,あるいは32ビット浮動小数点型).
- dst
- 出力配列.src と同じデータタイプ,または8ビット.
- threshold
- 閾値.
- max_value
- threshold_type が CV_THRESH_BINARY と CV_THRESH_BINARY_INV のときに使用する最大値.
- threshold_type
- 閾値処理の種類(説明参照).
関数 cvThreshold はシングルチャンネルの配列に対して,固定閾値での閾値処理を行う. この関数は特に,グレースケール画像からの2値化画像生成(cvCmpS もこの目的で使われる)や,ノイズ除去(例えば,あまりに大きい値またはあまりにも小さい値のピクセルを除去するなど)のために用いられることが多い. 以下に示す threshold_type のように数種類の閾値処理が可能.
threshold_type=CV_THRESH_BINARY: src(x,y)>thresholdの場合は,dst(x,y) = max_value それ以外は, 0 threshold_type=CV_THRESH_BINARY_INV: src(x,y)>thresholdの場合は,dst(x,y) = 0 それ以外は, max_value threshold_type=CV_THRESH_TRUNC: src(x,y)>thresholdの場合は,dst(x,y) = threshold それ以外は, src(x,y) threshold_type=CV_THRESH_TOZERO: src(x,y)>thresholdの場合は,dst(x,y) = src(x,y) それ以外は, 0 threshold_type=CV_THRESH_TOZERO_INV: src(x,y)>thresholdの場合は,dst(x,y) = 0 それ以外は, src(x,y)
以下に,閾値処理を種類別に図式化したものを示す.
AdaptiveThreshold
配列に対して適応的な閾値処理を行う
void cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,
int threshold_type=CV_THRESH_BINARY,
int block_size=3, double param1=5 );
- src
- 入力画像.
- dst
- 出力画像.
- max_value
- threshold_type が CV_THRESH_BINARY あるいは CV_THRESH_BINARY_INV のときに用いる最大値.
- adaptive_method
- 適応的閾値処理で使用するアルゴリズム.CV_ADAPTIVE_THRESH_MEAN_C または CV_ADAPTIVE_THRESH_GAUSSIAN_C (説明参照).
- threshold_type
- 閾値処理の種類,以下のどちらか.
- CV_THRESH_BINARY,
- CV_THRESH_BINARY_INV
- block_size
- ピクセルの閾値を計算するために用いる隣接領域のサイズ: 3, 5, 7, ...
- param1
- 各適応手法に応じたパラメータ. 適応手法が CV_ADAPTIVE_THRESH_MEAN_C およびCV_ADAPTIVE_THRESH_GAUSSIAN_C の場合は,平均値または重み付き平均値から引く定数(説明参照),負の値の場合もある.
関数 cvAdaptiveThreshold は,次式に従いグレースケール画像を2値画像に変換する.
threshold_type=CV_THRESH_BINARY: src(x,y)>T(x,y)の場合は,dst(x,y) = max_value それ以外は, 0 threshold_type=CV_THRESH_BINARY_INV: src(x,y)>T(x,y)の場合は,dst(x,y) = 0 それ以外は, max_value
ここで TI は,各ピクセル独自に計算された閾値.
手法 CV_ADAPTIVE_THRESH_MEAN_C では,注目ピクセルの block_size × block_size 隣接領域の平均から,param1 を引いた値.
手法 CV_ADAPTIVE_THRESH_GAUSSIAN_C では,注目ピクセルの block_size × block_size 隣接領域の重み付き総和(ガウシアン)から param1 を引いた値.