配列に対して,適応的な閾値処理を行います.
パラメタ: |
|
---|
関数 adaptiveThreshold は,以下の式にしたがってグレースケール画像を2値画像に変換します:
THRESH_BINARY
THRESH_BINARY_INV
ここで は,個々のピクセルに対して求められる閾値です.
この関数は,置換モードでも動作します.
参考: threshold() , blur() , GaussianBlur()
画像の色空間を変換します.
パラメタ: |
|
---|
関数 cvtColor は,入力画像の色空間を別の色空間に変換します.RGB 色空間との相互変換の場合,チャンネルの順序を明示的に指定する必要があります(RGB あるいは BGR).
R, G, B チャンネルの値の標準的な範囲は,以下のようになります:
もちろん,線形変換の場合は,この範囲は問題にいけません.しかし,RGB L*u*v* 変換のような非線形変換の場合,RGB入力画像を適切な範囲にある値に正規化しなければいけません.例えば,8ビット画像をスケーリングなしで32ビット浮動小数点型画像に変換すると,この関数では0から1の範囲を仮定しているにも関わらず,実際には0から1の範囲の値になります.したがって, cvtColor を呼ぶ前に,まず画像をスケーリングする必要があります:
img *= 1./255;
cvtColor(img, img, CV_BGR2Luv);
この関数では,以下の変換が可能です:
RGB 空間内での変換,アルファチャンネルの追加や削除,チャンネル順序の反転,16ビットRGBカラー(R5:G6:B5 または R5:G5:B5)との相互変換,グレースケールとの相互変換.これには,以下の式を利用します:
と
RGB画像からグレースケールへの変換は,次のようになります:
cvtColor(src, bwsrc, CV_RGB2GRAY);
より高度なチャンネル順序の変更は, mixChannels を利用して行うことができます.
RGB CIE XYZ ,Rec 709仕様,D65 白色点 ( CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB ):
, および は,全範囲をカバーします(浮動小数点型の画像の場合, は1を越える可能性があります).
RGB YCrCb JPEG (YCCとも呼ばれます) ( CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB )
ここで,
Y, Cr および Cb は,全範囲をカバーします.
RGB HSV ( CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB )
8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.
もし ならば 出力値の範囲は, , , .
これらの値は,出力されるべき型に変換されます:
8ビット画像
現在はサポートされていません
H, S, V は,そのまま
RGB HLS ( CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB ).
8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.
if then 出力の範囲は, , , .
これらの値は,出力されるべき型に変換される:
8ビット画像
現在はサポートされていません
H, S, V は,そのまま
RGB CIE L*a*b* ( CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB )
8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.
ここで,
および
出力の範囲は, , , これらの値は,出力されるべき型に変換されます:
8ビット画像
現在はサポートされていません
L, a, b は,そのまま
RGB CIE L*u*v* ( CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB )
8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.
出力の範囲は, , , .
これらの値は,出力されるべき型に変換されます:
8ビット画像
現在はサポートされていません
L, u, v は,そのまま
上に示したRGBと各種の色空間との変換式は,Web上の複数の情報を参考にしています.特に Charles Poynton のサイト http://www.poynton.com/ColorFAQ.html からは多くの情報を得ました.
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つのプレーンから,カラー画像を得ることができます.
出力される各ピクセルのRGB値は,同色のピクセルの 1隣接,2隣接 あるいは4隣接を用いた補間により求められます. 上述のパターンには,いくつかのバリエーションが存在します.それらは,パターンを1ピクセルだけ左にシフト,さらに(あるいは)1ピクセルだけ上にシフトすることで得られます. また,変換定数
CV_Bayer 2BGR と
CV_Bayer 2RGB に現れる2つの文字 と は,パターンの種類を表しています. つまり,この2文字は,あるパターンの2行目の2,3番目の成分であり,例えば,上述の図で表されたパターンは,まさに “BG” タイプです.
入力画像中の非0ピクセルから,最も近い0ピクセルまでの距離を,全ての非0ピクセルに対して計算します.
パラメタ: |
|
---|
関数 distanceTransform は,2値画像の各ピクセルから,最も近い値0のピクセルまでの近似距離または正確な距離を求めます(値が0のピクセルからの距離は,もちろん0).
maskSize == CV_DIST_MASK_PRECISE かつ distanceType == CV_DIST_L2 の場合,この関数は Felzenszwalb04 で述べられているアルゴリズムを実行します.
その他の場合は, Borgefors86 のアルゴリズムが利用されます.つまり,基本移動の組み合わせで0ピクセルに至るまでの最短距離を見つけます. この基本移動とは,水平,垂直,斜め,桂馬飛び(これは サイズのマスクを利用した場合のみ)移動です. これらの基本移動距離の合計が全長距離となります. 距離関数は対称性をもつはずなので,水平および垂直移動のコスト(これを a で表します)は全て等しくなければいけません.同様に,斜め移動のコスト(これを b で表します)もすべて等しく,桂馬飛び移動のコスト(これを c で表します)もすべて等しくなくてはいけません.距離の種類が CV_DIST_C や CV_DIST_L1 の場合,距離は正確に計算されますが, CV_DIST_L2 (ユークリッド距離)の場合は,距離にいくらかの相対誤差( マスクを用いると精度が向上する)が含まれます.OpenCVでは, a , b および c の値として,元論文で述べられている値を利用しています:
CV_DIST_C | a = 1, b = 1 | |
---|---|---|
CV_DIST_L1 | a = 1, b = 2 | |
CV_DIST_L2 | a=0.955, b=1.3693 | |
CV_DIST_L2 | a=1, b=1.4, c=2.1969 |
通常は,高速化のために,粗い距離推定 CV_DIST_L1 では のマスクが利用され, より正確な距離推定 CV_DIST_L2 では のマスクが利用されます.
粗い推定と正確な推定のどちらのアルゴリズムも,ピクセル数に対して線形であることに注意してください.
2番目の関数形式は,各ピクセル に対する最小距離だけでなく,0ピクセルで構成された連結成分のうち最も近いものを特定します. そして,その連結成分のインデックスが に格納されます.検出された0ピクセルの連結成分は,この関数によってマークされます.
このモードでも,計算量は線形です.つまり,この関数を使って,2値画像に対するボロノイ図を非常に高速に計算できるということです.現在のところ,この2番目の形式では,近似距離変換アルゴリズムのみが利用可能です.
連結成分を指定した色で塗りつぶします.
パラメタ: |
|
---|
関数 floodFill は,指定された色で連結成分を塗りつぶします.塗りつぶしは,シードピクセルから開始されます.連結しているかどうかは,隣接ピクセル値同士の色/輝度値の距離によって決まります. のピクセルが塗りつぶされる領域に属していると見なされるのは,以下の場合です:
グレースケール画像,変動範囲
グレースケール画像,固定範囲
カラー画像,変動範囲
カラー画像,固定範囲
ここで, は,ある隣接ピクセルのピクセル値を表します.つまり,対象ピクセルの色/輝度値が,次の値に十分近い場合に連結成分に追加されます:
これらの関数を利用すると,連結成分を指定色で塗りつぶしてマークする,マスクを作成して輪郭を抽出する,あるいは領域を別の画像にコピーする,といったことが可能になります.この関数の様々なモードは,サンプル floodfill.c でデモされます.
参考: findContours()
選択領域内の画像を修復します.
パラメタ: |
|
---|
関数 inpaint は,選択された画像領域を,その領域境界付近のピクセルを利用して再構成します.この関数は,スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするために利用されます.詳しくは http://en.wikipedia.org/wiki/Inpainting を参照してください.
インテグラルイメージを求めます.
パラメタ: |
|
---|
関数 integral は,入力画像に対する1つあるいは複数のインテグラルイメージを次のように求めます:
このようなインテグラルイメージを用いると,画像中の任意の矩形領域(あるいは45度回転した矩形領域)の画素値の総和,平均,標準偏差を定数時間で計算できます.例えば:
これを用いて,例えば,窓サイズ可変な平滑化や相関演算を高速に計算することが可能です.マルチチャンネル画像の場合は,各チャンネルでの総和が個別に累積されます.
実際の例として,次の図では,直立した矩形 Rect(3,3,3,2) のインテグラルイメージと傾いた矩形 Rect(5,1,2,3) のインテグラルイメージの計算について示します.インテグラルイメージ sum と tilted 中の関連ピクセルと一緒に,その元画像 image における選択ピクセルが表示されています.
begin{center}
end{center}
配列の要素に対して,ある定数での閾値処理を行います.
パラメタ: |
|
---|
この関数は,シングルチャンネルの配列に対して,ある定数での閾値処理を行います.これは,グレースケールからの2値画像生成(関数 compare も,この目的に利用できます)やノイズ除去(つまり,小さすぎたり大きすぎたりする値をはじく処理)などに利用される場合が多いです.この関数がサポートする閾値処理にはいくつかの種類があり,それは引数 thresholdType によって決定されます:
THRESH_BINARY
THRESH_BINARY_INV
THRESH_TRUNC
THRESH_TOZERO
THRESH_TOZERO_INV
また,特殊な値 THRESH_OTSU を,上述のものと組み合わせて使うこともできます.この場合,関数は大津のアルゴリズムを用いて最適な閾値を決定し,それを引数 thresh で指定された値の代わりに利用します.この関数は,計算された閾値を返します.また現在のところ,大津の手法は 8ビット画像に対してのみ実装されています.
参考: adaptiveThreshold() , findContours() , compare() , min() , max()
watershedアルゴリズムを用いて,マーカベースの画像セグメンテーションを行います.
パラメタ: |
|
---|
この関数は,参考文献 Meyer92 で述べられた,ノンパラメトリックなマーカベースのセグメンテーションアルゴリズムである Watershed のバリエーションの1つを実装したものです. 画像をこの関数に渡す前に,ユーザは画像をどのような領域に分割したいかを大まかに決めて,それを正( )のインデックスで markers 内に書き込んでおく必要があります.つまり,その場合の各領域は,1,2,3と いったピクセル値をもつ1つあるいは複数の連結成分で表現されます(このようなマーカは, findContours や drawContours を用いて2値マスクから抽出できます. watershed.cpp を参照してください). そして,このような連結成分は,画像領域分割のための「シード」となります.また, markers 内のその他のピクセルは,どの領域に属するかが未知であり,それはこのアルゴリズムによって定義されますが,まずは最初に 0 にセットされなければいけません. この関数の出力である markers 内の各ピクセルには,「シード」成分の値の1つがセットされます.また,領域の境界に位置するピクセルの場合は -1 がセットされます.
2つの隣接した連結成分が,必ずしも watershed 境界(-1 の値をもつピクセル)によって分割されるわけではないことに注意してください.例えば,初期 marker に接線成分が存在する場合などがこれにあたります.この関数の実際のデモと使用例については,OpenCVサンプルディレクトリにある watershed.cpp デモを参照してください.
参考: findContours()