CV リファレンス マニュアル
-
画像処理(Image Processing)
- 勾配,エッジ,コーナー,特徴(Gradients, Edges, Corners and Features)
- サンプリング,補間,幾何変換(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 size1=3, int size2=0, double sigma1=0, double sigma2=0 );
- src
- 入力画像.
- dst
- 出力画像.
- smoothtype
- 平滑化の手法
- CV_BLUR_NO_SCALE(スケーリング無しの単純平滑化)
- 各ピクセルに対して,その処理結果は,
size1×
size2 隣接領域のピクセル値の総和となる. もし,ピクセル毎に隣接サイズが変化する場合は,インテグラルイメージ (cvIntegral) を利用して総和を計算する. - CV_BLUR(単純平滑化) - 各ピクセルに対して,その処理結果は, size1×size2 隣接領域の平均値(輝度値/色)となる.
- CV_GAUSSIAN(ガウシアン平滑化) - 画像は,アパーチャサイズがsize1×size2のガウシアンカーネルを用いて平滑化さ れる.sigma1とsigma2 は,カーネルの形を指定するために用いられるオプション.
- CV_MEDIAN(メディアンフィルタ/中央値平滑化) - 画像は, size1×size1 サイズ(つまり,正方形)の中央値フィルタを用いて平滑される. よって,各ピクセルに対して,その処理結果は, size1×size1 隣接領域の中央値となる.
- CV_BILATERAL(バイラテラルフィルタ/エッジ保持平滑化) - 画像は,3×3のバイラテラルフィルタを用いて平滑化される. このバイラテラルフィルタのパラメータは, 色(輝度値)についてsigma=sigma1, 領域(距離)についてsigma=sigma2である. size1!=0の場合, 直径size1の円形カーネルが用いられる. そうでない場合は,sigma2からカーネルの直 径が計算される. バイラテラルフィルタに関する情報は, http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html を参照.
- CV_BLUR_NO_SCALE(スケーリング無しの単純平滑化)
- 各ピクセルに対して,その処理結果は,
size1×
- size1
- 平滑化処理のパラメータ1.平滑化処理に用いられるピクセルの近傍 がそのピクセルに対して対称になるように,この値は奇数(1,3, 5)である必要がある.
- size2
- 平滑化処理のパラメータ2.平滑化手法が,スケーリング有り/無しの単純平滑またはガウシアン平滑化の場合,size2 が0のときは size1 にセットされる.
- sigma1
- ガウシアン平滑化の場合,このパラメータがガウシアン sigma(標準偏差)を示す.0の場合,以下のようにカーネルサイズから計算する.
sigma = (n/2 - 1)*0.3 + 0.8,ここで 水平カーネルの場合は,n=param1 垂直カーネルの場合は,n=param2
小さいサイズのカーネル(3×3 から 7×7 まで)の場合は通常の sigma を用いる方がパフォーマンスが良い. size1 と size2が 0 で,sigma1 が 非0の場合, カーネルサイズはこの sigmaより計算される(十分な精度を得るため).バイラテラルフィルタの場合,このパラメータは,色に対する sigma を示す. この値が大きくなると,フィルタのポスタリゼーション効果が強くなる.
- sigma2
- 非正方形のガウシアンカーネルを使用する場合,垂直方向に異なる sigma
値(sigma1と違う値)を指定するために用いられる.
バイラテラルフィルタの場合,このパラメータは,空間に対する sigma を示す. この値が大きくなると,フィルタのブラー効果が強くなる. 大きなsigma2を用いると,処理速度が非常に遅くなることに注意する. パラメータsize1を用いて, カーネルサイズに制限を設けることを勧める.
関数 cvSmooth は,予め定義された手法のうち一つを選んで画像の平滑化を行う. 各手法は,以下に示すような特徴や制限を持つ:
- スケーリング無しの平滑化は,シングルチャンネル画像を対象とし, 符号無し8ビットフォーマットの符号有り16ビットフォーマットへの累積(cvSobel や cvLaplace と同様), 32ビット浮動小数点の32ビット浮動小数点への累積,をサポートしている.
- 単純平滑化とガウシアン平滑化は,1 あるいは 3チャンネル,8ビット,16 ビット,32ビット浮動小数点画像をサポートしている. これら2つの手法 は,インプレースモードでの処理が可能である.
- 中央値フィルタは,,1あるいは 3チャンネル,8ビット画像をサポートして いる.インプレースモードでの処理は不可能である.
- バイラテラルフィルタは,1あるいは 3チャンネル,8ビット,32ビット浮動 小数点画像をサポートしている.インプレースモードでの処理は不可能である.
Filter2D
画像に線形フィルタを適用する
void cvFilter2D( const CvArr* src, CvArr* dst,
const CvMat* kernel,
CvPoint anchor=cvPoint(-1,-1));
- src
- 入力画像.
- dst
- 出力画像.
- kernel
- フィルタ.係数のシングルチャンネルの2次元浮動小数点型行列. マルチチャンネル画像の場合,同一のカーネルを用いて各チャンネルが独立に処理される. 異なるチャンネルに対して異なるカーネルを適用する場合は, cvSplit を用いて画像を分離し,各チャンネル毎にフィルタを適用する.
- anchor
- カーネルのアンカー.カーネルマスクでカバーされる隣接領域内における, フィルタ対象となるピクセルの相対位置を表す. デフォルトはカーネルの中心を表す特別な値(-1,-1)である.
関数 cvFilter2D は,指定された線形フィルタを画像に適用する. インプレース処理がサポートされている. フィルタ範囲が部分的に画像外に出てしまった場合は,画像境界のピクセルから範囲外のピクセル値を補間する. 入力画像に ROI が設定されてた場合, cvFilter2D は,OpenCV の他の多くの関数と同じように,これを独立した一つの画像として扱う. つまり,入力画像内部であり,ROI 外部であるピクセルは無視される. このような処理を望まない場合は,cv.hpp で宣言される新しい C++ フィルタリングクラスを検討すること.
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 あるいは R5:G5:B5)から/への変換,あるいはグレースケールから/への変換:
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 の各ピクセル(ある特定のセンサ)がこのように交互に配置された1つのプレーンから,カラー画像を得ることができる.
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
配列の要素に対して一定値での閾値処理を行う
double 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 を引いた値.