配列に対して,適応的な閾値処理を行います.
パラメタ: |
|
---|
関数 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から255の範囲の値になります.したがって,
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 中の関連ピクセルが表示されています.
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 中に,1点で接する2つの連結成分が存在する場合などがこれにあたります.この関数の実際のデモと使用例については,OpenCVサンプルディレクトリにある watershed.cpp デモを参照してください.
参考: findContours()
GrabCut アルゴリズムを実行します.
パラメタ: |
|
---|
この関数は, GrabCut 画像セグメンテーションアルゴリズムを実行します. 関数の使い方については,サンプルの grabcut.cpp を参照してください.