その他の画像変換

cv::AdaptiveThreshold

void cvAdaptiveThreshold(const CvArr* src, CvArr* dst, double maxValue, int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, int thresholdType=CV_THRESH_BINARY, int blockSize=3, double param1=5)

配列に対して,適応的な閾値処理を行います.

パラメタ:
  • src – 入力配列
  • dst – 出力配列
  • maxValueCV_THRESH_BINARYCV_THRESH_BINARY_INV の場合に利用される,最大値の値
  • adaptive_method – 適応的閾値処理で使用するアルゴリズム: CV_ADAPTIVE_THRESH_MEAN_C あるいは CV_ADAPTIVE_THRESH_GAUSSIAN_C (以下の説明を参照してください)
  • threshold_type

    閾値処理の種類.以下のうちの1つ

    • CV_THRESH_BINARY xxx
    • CV_THRESH_BINARY_INV xxx
  • blockSize – ピクセルに対する閾値を計算するために利用する,そのピクセルの近傍領域のサイズ:3,5,7,...
  • param1 – 利用する手法に依存するパラメータ.例えば, CV_ADAPTIVE_THRESH_MEAN_CCV_ADAPTIVE_THRESH_GAUSSIAN_C の場合は,平均あるいは荷重平均から引かれる定数(説明を参照してください)を意味するが,負の値も取り得ます

この関数は,次式に従いグレースケール画像を2値画像に変換します:

  • CV_THRESH_BINARY

    dst(x,y) =  \fork{\texttt{maxValue}}{if $src(x,y) > T(x,y)$}{0}{otherwise}

  • CV_THRESH_BINARY_INV

    dst(x,y) =  \fork{0}{if $src(x,y) > T(x,y)$}{\texttt{maxValue}}{otherwise}

ここで, T(x,y) は各ピクセルに対して個別に計算される閾値です.

手法 CV_ADAPTIVE_THRESH_MEAN_C の場合は, \texttt{block\_size} \times \texttt{block\_size} ピクセルの近傍領域 の平均値から param1 を引いた値です.

また,手法 CV_ADAPTIVE_THRESH_GAUSSIAN_C の場合は, \texttt{block\_size} \times \texttt{block\_size} ピクセルの近傍領域のガウシアンを重みとした総和から param1 を引いた値です.

cv::CvtColor

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

画像の色空間を変換します.

パラメタ:
  • src – 入力画像,8ビット(8u),16ビット(16u),あるいは単精度浮動小数点型(32f)
  • dst – 出力画像,入力が像と同じデータ型.チャンネル数は異なる可能性がある
  • codeCV_ *src_color_space* 2 *dst_color_space* という定数を用いて指定する色変換処理(以下を参照してください)

この関数は,入力画像をある色空間から別の色空間へと変換します.これは, IplImage のヘッダのフィールド colorModelchannelSeq を無視しますので,ユーザは入力画像の色空間を正しく指定しなければいけません(RGB空間の場合はチャンネルの順番も正しく指定してください.例えば,BGRは, B_0, G_0, R_0, B_1, G_1, R_1, ... というレイアウトの24ビットフォーマットを表しており,RGBは, R_0, G_0, B_0, R_1, G_1, B_1, ... というレイアウトの24ビットフォーマットを表しています).

R,G,B チャンネルの一般的な範囲は以下のとおりです:

  • 8ビット画像では 0 から 255
  • 16ビット画像では 0 から 65535
  • 浮動小数点型画像では 0 から 1

もちろん,線形変換の場合はその範囲を特定することができますが,非線形変換の場合に正しい結果を得るためには,入力画像をスケーリングする必要があります.

この関数は,以下のような変換を行うことができます:

  • アルファチャンネルの追加/削除や,チャンネル順序の反転などのRGB空間内での変換.以下の式を利用した,16ビットRGBカラー(R5:G6:B5 あるいは R5:G5:B5)から/への変換,あるいはグレースケールから/への変換:

    \text{RGB[A] to Gray:} Y  \leftarrow 0.299  \cdot R + 0.587  \cdot G + 0.114  \cdot B

    および

    \text{Gray to RGB[A]:} R  \leftarrow Y, G  \leftarrow Y, B  \leftarrow Y, A  \leftarrow 0

    RGB画像からグレースケールへの変換は,次のようになります:

    cvCvtColor(src ,bwsrc, CV_RGB2GRAY)
    
  • RGB \leftrightarrow CIE XYZ ,Rec 709仕様,D65 白色点 ( CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB ):

    \begin{bmatrix} X  \\ Y  \\ Z
  \end{bmatrix} \leftarrow \begin{bmatrix} 0.412453 & 0.357580 & 0.180423 \\ 0.212671 & 0.715160 & 0.072169 \\ 0.019334 & 0.119193 & 0.950227
  \end{bmatrix} \cdot \begin{bmatrix} R  \\ G  \\ B
  \end{bmatrix}

    \begin{bmatrix} R  \\ G  \\ B
  \end{bmatrix} \leftarrow \begin{bmatrix} 3.240479 & -1.53715 & -0.498535 \\ -0.969256 &  1.875991 & 0.041556 \\ 0.055648 & -0.204043 & 1.057311
  \end{bmatrix} \cdot \begin{bmatrix} X  \\ Y  \\ Z
  \end{bmatrix}

    X , Y および Z は,全範囲をカバーします(浮動小数点型の画像の場合, Z は1を越える可能性があります).

  • RGB \leftrightarrow YCrCb JPEG (a.k.a. YCC) ( CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB )

    Y  \leftarrow 0.299  \cdot R + 0.587  \cdot G + 0.114  \cdot B

    Cr  \leftarrow (R-Y)  \cdot 0.713 + delta

    Cb  \leftarrow (B-Y)  \cdot 0.564 + delta

    R  \leftarrow Y + 1.403  \cdot (Cr - delta)

    G  \leftarrow Y - 0.344  \cdot (Cr - delta) - 0.714  \cdot (Cb - delta)

    B  \leftarrow Y + 1.773  \cdot (Cb - delta)

    ここで

    delta =  \left \{ \begin{array}{l l} 128 &  \mbox{for 8-bit images} \\ 32768 &  \mbox{for 16-bit images} \\ 0.5 &  \mbox{for floating-point images} \end{array} \right .

    Y, Cr および Cb は,全範囲をカバーします.

  • RGB \leftrightarrow HSV ( CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.

    V  \leftarrow max(R,G,B)

    S  \leftarrow \fork{\frac{V-min(R,G,B)}{V}}{if $V \neq 0$}{0}{otherwise}

    H  \leftarrow \forkthree{{60(G - B)}/{S}}{if $V=R$}{{120+60(B - R)}/{S}}{if $V=G$}{{240+60(R - G)}/{S}}{if $V=B$}

    もし H<0 ならば H \leftarrow H+360 出力値の範囲は, 0 \leq V \leq 1 , 0 \leq S \leq 1 , 0 \leq H \leq 360 です.

    これらの値は,出力されるべき型に変換されます:

    • 8ビット画像

      V  \leftarrow 255 V, S  \leftarrow 255 S, H  \leftarrow H/2  \text{(to fit to 0 to 255)}

    • 16ビット画像

      現在はサポートされていません

      V <- 65535 V, S <- 65535 S, H <- H

    • 32ビット画像

      H, S, V は,そのまま

  • RGB \leftrightarrow HLS ( CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB ). 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.

    V_{max}  \leftarrow {max}(R,G,B)

    V_{min}  \leftarrow {min}(R,G,B)

    L  \leftarrow \frac{V_{max} + V_{min}}{2}

    S  \leftarrow \fork { \frac{V_{max} - V_{min}}{V_{max} + V_{min}} }{if  $L < 0.5$ }
    { \frac{V_{max} - V_{min}}{2 - (V_{max} + V_{min})} }{if  $L \ge 0.5$ }

    H  \leftarrow \forkthree {{60(G - B)}/{S}}{if  $V_{max}=R$ }
  {{120+60(B - R)}/{S}}{if  $V_{max}=G$ }
  {{240+60(R - G)}/{S}}{if  $V_{max}=B$ }

    もし H<0 ならば H \leftarrow H+360 出力の範囲は, 0 \leq L \leq 1 , 0 \leq S \leq 1 , 0 \leq H \leq 360 です.

    これらの値は,出力されるべき型に変換されます:

    • 8ビット画像

      V  \leftarrow 255 V, S  \leftarrow 255 S, H  \leftarrow H/2  \text{(to fit to 0 to 255)}

    • 16ビット画像

      現在はサポートされていません

      V <- 65535 V, S <- 65535 S, H <- H

    • 32ビット画像

      H, S, V は,そのまま

  • RGB \leftrightarrow CIE L*a*b* ( CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.

    \vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}

    X  \leftarrow X/X_n,  \text{where} X_n = 0.950456

    Z  \leftarrow Z/Z_n,  \text{where} Z_n = 1.088754

    L  \leftarrow \fork{116*Y^{1/3}-16}{for $Y>0.008856$}{903.3*Y}{for $Y \le 0.008856$}

    a  \leftarrow 500 (f(X)-f(Y)) + delta

    b  \leftarrow 200 (f(Y)-f(Z)) + delta

    ここで

    f(t)= \fork{t^{1/3}}{for $t>0.008856$}{7.787 t+16/116}{for $t<=0.008856$}

    および

    delta =  \fork{128}{for 8-bit images}{0}{for floating-point images}

    となります. 出力の範囲は, 0 \leq L \leq 100 , -127 \leq a \leq 127 , -127 \leq b \leq 127 です.

    これらの値は,出力されるべき型に変換されます:

    • 8ビット画像

      L  \leftarrow L*255/100, a  \leftarrow a + 128, b  \leftarrow b + 128

    • 16ビット画像

      現在はサポートされていません

    • 32ビット画像

      L, a, b は,そのまま

  • RGB \leftrightarrow CIE L*u*v* ( CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます.

    \vecthree{X}{Y}{Z} \leftarrow \vecthreethree{0.412453}{0.357580}{0.180423}{0.212671}{0.715160}{0.072169}{0.019334}{0.119193}{0.950227} \cdot \vecthree{R}{G}{B}

    L  \leftarrow \fork{116 Y^{1/3}}{for $Y>0.008856$}{903.3 Y}{for $Y<=0.008856$}

    u'  \leftarrow 4*X/(X + 15*Y + 3 Z)

    v'  \leftarrow 9*Y/(X + 15*Y + 3 Z)

    u  \leftarrow 13*L*(u' - u_n)  \quad \text{where} \quad u_n=0.19793943

    v  \leftarrow 13*L*(v' - v_n)  \quad \text{where} \quad v_n=0.46831096

    出力の範囲は, 0 \leq L \leq 100 , -134 \leq u \leq 220 , -140 \leq v \leq 122 です

    これらの値は,出力されるべき型に変換されます:

    • 8ビット画像

      L  \leftarrow 255/100 L, u  \leftarrow 255/354 (u + 134), v  \leftarrow 255/256 (v + 140)

    • 16ビット画像

      現在はサポートされていません

    • 32ビット画像

      L, u, v は,そのまま

    上に示したRGBと各種の色空間との変換式は,Web上の複数の情報を参考にしています.特に Charles Poynton のサイト http://www.poynton.com/ColorFAQ.html からは多くの情報を得ました.

  • Bayer \rightarrow RGB ( CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, CV_BayerGR2RGB ) Bayer パターンは,CCD カメラや CMOS カメラなどで広く利用されています.R,G,B の各ピクセル(ある特定のセンサ)が次ように交互に配置された1つのプレーンから,カラー画像を得ることができます.

    \newcommand{\Rcell}{\color{red}R} \newcommand{\Gcell}{\color{green}G} \newcommand{\Bcell}{\color{blue}B} \definecolor{BackGray}{rgb}{0.8,0.8,0.8} \begin{array}{ c c c c c } \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \\ \Gcell & \colorbox{BackGray}{\Bcell} & \colorbox{BackGray}{\Gcell} & \Bcell & \Gcell \\ \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \\ \Gcell & \Bcell & \Gcell & \Bcell & \Gcell \\ \Rcell & \Gcell & \Rcell & \Gcell & \Rcell \end{array}

    出力される各ピクセルのRGB値は,同色のピクセルの 1隣接,2隣接 あるいは4隣接を用いた補間により求められます.上述のパターンには,いくつかのバリエーションが存在します.それらは,パターンを1ピクセルだけ左にシフト,さらに(あるいは)1ピクセルだけ上にシフトすることで得られます.また,変換定数

    CV_Bayer C_1 C_2 2BGR

    CV_Bayer C_1 C_2 2RGB に現れる2つの文字 C_1C_2 は,パターンの種類を表しています.つまり,この2文字は,あるパターンの2行目の2,3番目の成分であり,例えば,上述の図で表されたパターンは,まさに “BG” タイプです.

cv::DistTransform

void cvDistTransform(const CvArr* src, CvArr* dst, int distance_type=CV_DIST_L2, int mask_size=3, const float* mask=NULL, CvArr* labels=NULL)

入力画像中の非0ピクセルから,最も近い0ピクセルまでの距離を,全ての非0ピクセルに対して計算します.

パラメタ:
  • src – 8ビット,シングルチャンネル(2値)の入力画像
  • dst – 求められた距離を値とする出力画像. src と同じサイズの,32ビット,浮動小数点型,シングルチャンネル画像
  • distance_type – 距離の種類. CV_DIST_L1, CV_DIST_L2 あるいは CV_DIST_C
  • mask_size – 距離変換マスクのサイズ.3 あるいは 5. CV_DIST_L1CV_DIST_C の場合は,このパラメータは強制的に3になる. なぜなら,この場合 3\times 3 サイズのマスクは 5\times 5 サイズのマスクと同じ結果で計算速度が速いからです
  • mask – ユーザ定義の距離を計算する際に用いられるユーザ定義のマスク. 3\times 3 マスクの場合は,2つの値(水平/垂直方向移動コスト,斜め移動コスト)で構成され, 5\times 5 マスクの場合は,3つの値(水平/垂直方向移動コスト,斜め移動コスト,桂馬飛び移動コスト)で構成されます
  • labels – オプション.整数型のラベルを要素にもつ2次元出力配列. srcdst と同じサイズです

この関数は,2値画像上の各ピクセルから,最も近い0ピクセルへの近似距離を求めます.これは,0ピクセルに対しては距離0をセットし,その他のピクセルに対しては,基本移動の組み合わせで0ピクセルに至るまでの最短距離を見つけます.基本移動は,水平,垂直,斜め,桂馬飛び(これは 5\times 5 サイズのマスクを利用した場合のみ)移動であり,全長距離は,これらの基本移動距離の合計となります.距離関数は対称性をもつはずなので,水平および垂直移動のコスト(これを a で表す)は全て等しくなければいけません.同様に,斜め移動のコスト(これを b で表す)も全て等しく,桂馬飛び移動のコスト(これを c で表す)も全て等しくなくてはいけません.距離の種類が CV_DIST_CCV_DIST_L1 の場合,距離は正確に計算されますが, CV_DIST_L2 (ユークリッド距離)の場合は,距離はいくらかの相対誤差( 5\times 5 マスクを用いると精度が向上します)を持ちます.OpenCVでは,次のように Borgefors86 で推奨される値を利用しています:

CV_DIST_C (3\times 3) a = 1, b = 1
CV_DIST_L1 (3\times 3) a = 1, b = 2
CV_DIST_L2 (3\times 3) a=0.955, b=1.3693
CV_DIST_L2 (5\times 5) a=1, b=1.4, c=2.1969

以下は,ユーザ定義距離を利用した場合の,距離フィールド(白い矩形の中心に黒(0)ピクセルがある)の例です:

ユーザ定義 3 \times 3 マスク (a=1, b=1.5)

4.5 4 3.5 3 3.5 4 4.5
4 3 2.5 2 2.5 3 4
3.5 2.5 1.5 1 1.5 2.5 3.5
3 2 1   1 2 3
3.5 2.5 1.5 1 1.5 2.5 3.5
4 3 2.5 2 2.5 3 4
4.5 4 3.5 3 3.5 4 4.5

ユーザ定義 5 \times 5 マスク (a=1, b=1.5, c=2)

4.5 3.5 3 3 3 3.5 4.5
3.5 3 2 2 2 3 3.5
3 2 1.5 1 1.5 2 3
3 2 1   1 2 3
3 2 1.5 1 1.5 2 3
3.5 3 2 2 2 3 3.5
4 3.5 3 3 3 3.5 4

通常は,高速化のために,粗い距離推定 CV_DIST_L2 では 3\times 3 のマスクが利用され,より正確な距離推定 CV_DIST_L2 では 5\times 5 のマスクが利用されます.

出力パラメータ labelsNULL ではない場合,この関数は,全ての0非ピクセルに対して最も近い値0の連結成分を求めます.この連結成分自体は,関数処理の最初で輪郭として検出されます.

このモードでは,処理時間がたかだか O(N) (Nはピクセル数)なので,これを利用すると,2値画像に対する近似的なボロノイ図を高速に求めることができます.

CvConnectedComp

CvConnectedComp
typedef struct CvConnectedComp
{
    double area;    /* セグメント化された連結成分の面積 */
    CvScalar value; /* 連結成分の平均色 */
    CvRect rect;    /* セグメント化された連結成分の ROI */
    CvSeq* contour; /* オプションである連結成分の境界
                      (その輪郭は,「穴」に相当するような子輪郭を持つ可能性があります) */
} CvConnectedComp;

cv::FloodFill

void cvFloodFill(CvArr* image, CvPoint seed_point, CvScalar new_val, CvScalar lo_diff=cvScalarAll(0), CvScalar up_diff=cvScalarAll(0), CvConnectedComp* comp=NULL, int flags=4, CvArr* mask=NULL)

連結成分を指定した色で塗りつぶします.

パラメタ:
  • image – 入力画像.1あるいは3チャンネル,8ビットあるいは浮動小数点型.フラグ CV_FLOODFILL_MASK_ONLY が指定されている場合を除き,この関数によって書き換えられます(以下を参照してください)
  • seed_point – 連結成分の開始点
  • new_val – 領域の塗りつぶしに使う新しいピクセル値
  • lo_diff – 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容下限値.8ビットカラー画像の場合は,packされた値
  • up_diff – 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容上限値.8ビットカラー画像の場合は,packされた値
  • comp – 塗りつぶした領域に関する情報を代入する構造体へのポインタ. この関数は, comp->contour フィールドを埋めないことに注意してください.塗りつぶした領域の境界線は, FindContours を利用して,出力されるマスク画像から得ることができます
  • flags

    処理フラグ.下位ビットには,連結性を表す値である 4(デフォルト)あるいは 8 が含まれ,これらの値は関数内部で利用されます.この連結性は,どの隣接ピクセルを処理するべきかを定義します.上位ビットには,0 あるいは以下の値の組み合わせを含みます:

    • CV_FLOODFILL_FIXED_RANGE これが指定されている場合,現在のピクセルとシードピクセルとの間の差だけが考慮されます.指定されていなければ,隣接ピクセル同士の差が考慮されます(つまり,差の許容範囲が変動します)
    • CV_FLOODFILL_MASK_ONLY これが指定されている場合,この関数は画像を塗りつぶさずに(引数 new_val は無視されます),マスクを塗りつぶします(この場合は引数 mask がNULLであってはいけません)
  • mask – オプション.シングルチャンネル,8ビットのマスク画像. image よりも,幅高さ共に2ピクセルずつ大きくなります.これが NULLではない場合,関数はこのマスク画像を利用し更新するので,ユーザは mask の中身をきちんと初期化しておかなければいけません.この塗りつぶしは,マスク画像中の0ではないピクセルを越えることはできません.例えば,エッジ検出の出力画像は,塗りつぶしをエッジ部分で堰き止めるためのマスク画像として利用できます.また,塗りつぶされる領域同士が重ならないよう,複数回の関数呼び出しで同じマスク画像を利用することができます. 注意 :マスク画像は塗りつぶされる画像よりも大きいので, image 中のピクセル (x,y) に対応する mask 中のピクセルは (x+1,y+1) となります

この関数は,指定された色で連結成分を塗りつぶします.塗りつぶしは,シードピクセルから開始されます.連結しているかどうかは,ピクセル値同士の距離によって決まります. (x,y) のピクセルが塗りつぶされる領域に属していると見なされるのは,以下の場合です:

  • グレースケール画像,変動範囲

    src(x',y')- \texttt{lo\_diff} <= src(x,y) <= src(x',y')+ \texttt{up\_diff}

  • グレースケール画像,固定範囲

    src(seed.x,seed.y)- \texttt{lo\_diff} <=src(x,y)<=src(seed.x,seed.y)+ \texttt{up\_diff}

  • カラー画像,変動範囲

    src(x',y')_r- \texttt{lo\_diff} _r<=src(x,y)_r<=src(x',y')_r+ \texttt{up\_diff} _r

    src(x',y')_g- \texttt{lo\_diff} _g<=src(x,y)_g<=src(x',y')_g+ \texttt{up\_diff} _g

    src(x',y')_b- \texttt{lo\_diff} _b<=src(x,y)_b<=src(x',y')_b+ \texttt{up\_diff} _b

  • カラー画像,固定範囲

    src(seed.x,seed.y)_r- \texttt{lo\_diff} _r<=src(x,y)_r<=src(seed.x,seed.y)_r+ \texttt{up\_diff} _r

    src(seed.x,seed.y)_g- \texttt{lo\_diff} _g<=src(x,y)_g<=src(seed.x,seed.y)_g+ \texttt{up\_diff} _g

    src(seed.x,seed.y)_b- \texttt{lo\_diff} _b<=src(x,y)_b<=src(seed.x,seed.y)_b+ \texttt{up\_diff} _b

ここで, src(x',y') は,ある隣接ピクセルのピクセル値を表します.つまり,対象ピクセルの色/輝度値が,次の値に十分近い場合に連結成分に追加されます:

  • 変動範囲の場合:既に連結成分に属する隣接ピクセルの色/輝度値
  • 固定範囲の場合:シードピクセルの色/輝度値.

cv::Inpaint

void cvInpaint(const CvArr* src, const CvArr* mask, CvArr* dst, double inpaintRadius, int flags)

選択領域内の画像を修復します.

パラメタ:
  • src – 入力画像.8ビット,1あるいは3チャンネル
  • mask – 8ビット,1チャンネルの修復マスク.非0のピクセルが,修復が必要な領域を表します
  • dst – 出力画像.入力画像と同じフォーマット,同じサイズ
  • inpaintRadius – 修復される点周りの円形の近傍領域の半径.これが,アルゴリズムに考慮されます
  • flags

    修復手法.以下のいずれか:

    • CV_INPAINT_NS ナビエ・ストークス(Navier-Stokes)ベースの手法
    • CV_INPAINT_TELEA Alexandru Telea による手法 Telea04

この関数は,選択された画像領域を,その領域境界付近のピクセルを利用して再構成します.この関数は,スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするために利用されます.

cv::Integral

void cvIntegral(const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tiltedSum=NULL)

インテグラルイメージを求めます.

パラメタ:
  • image – 入力画像, W\times H の8ビット,あるいは浮動小数点型(32f または 64f)
  • sum – インテグラルイメージ, (W+1)\times (H+1) の32ビット整数,あるいは倍精度浮動小数点型(64f)
  • sqsum – 各ピクセル値を2乗した画像に対するインテグラルイメージ, (W+1)\times (H+1) の倍精度浮動小数点型(64f)
  • tiltedSum – 45度傾けた画像に対するインテグラルイメージ, (W+1)\times (H+1) で,データの型は sum と同様

関数 cvIntegral は,入力画像に対する1つあるいは複数のインテグラルイメージを,次のように求めます:

\texttt{sum} (X,Y) =  \sum _{x<X,y<Y}  \texttt{image} (x,y)

\texttt{sqsum} (X,Y) =  \sum _{x<X,y<Y}  \texttt{image} (x,y)^2

\texttt{tiltedSum} (X,Y) =  \sum _{y<Y,abs(x-X+1) \leq Y-y-1}  \texttt{image} (x,y)

このようなインテグラルイメージを用いると,画像中の任意の矩形領域(あるいは45度回転した矩形領域)の画素値の総和,平均,標準偏差を定数時間で計算できます.例えば:

\sum _{x_1<=x<x_2,  \, y_1<=y<y_2} =  \texttt{sum} (x_2,y_2)- \texttt{sum} (x_1,y_2)- \texttt{sum} (x_2,y_1)+ \texttt{sum} (x_1,x_1)

となります. これにより,例えば,窓サイズ可変な平滑化や相関演算を高速に計算することが可能になります.また,マルチチャンネル画像の場合,各チャンネルでの総和が個別に累積されます.

cv::PyrMeanShiftFiltering

void cvPyrMeanShiftFiltering(const CvArr* src, CvArr* dst, double sp, double sr, int max_level=1, CvTermCriteria termcrit= cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 5, 1))

Mean-Shift法による画像セグメンテーションを行います.

パラメタ:
  • src – 入力画像.8ビット,3チャンネル
  • dst – 出力画像.入力が像と同じフォーマット,同じサイズ
  • sp – 空間窓の半径
  • sr – 色空間窓の半径
  • max_level – セグメンテーションに用いるピラミッドの最大レベル
  • termcrit – 終了条件:Mean-Shiftの反復をいつ止めるか

この関数は,Mean-Shiftセグメンテーションのフィルタリング部分の実装です.つまり,この関数の出力は,色勾配と細かいピクセル値の平坦化というフィルタ処理がされた「ポスタライズド」な画像となります.この関数は,入力画像中(あるいは,ダウンサイジングされた入力画像中,下記参照)の各ピクセル (X,Y) に対して,Mean-Shiftを繰り返します.つまり,空間-色を軸とする超空間内のピクセル (X,Y) の近傍領域は,次のように表されます:

(x,y): X- \texttt{sp} \le x  \le X+ \texttt{sp} , Y- \texttt{sp} \le y  \le Y+ \texttt{sp} , ||(R,G,B)-(r,g,b)||   \le \texttt{sr}

ここで (R,G,B)(r,g,b) は,それぞれ (X,Y)(x,y) における色成分のベクトルを表します(しかし,アルゴリズム自体は使用される色空間には依存しないので,任意の 3成分を持つ色空間を代わりに利用しても構いません).近傍領域において,平均空間ベクトル (X',Y') と平均色ベクトル (R',G',B') が求められ,それらのベクトルは,次の繰り返しにおいて近傍領域の中心として扱われます:

(X,Y)~(X',Y'), (R,G,B)~(R',G',B'). 反復計算終了後,最初のピクセル(つまり,繰り返し計算が開始された場所のピクセル)の色成分は,以下のような最終値(最後の繰り返しにおける平均色)にセットされます:

I(X,Y) <- (R*,G*,B*) \texttt{max\_level}>0 の場合,レベル \texttt{max\_level}+1 のガウシアンピラミッドが構成され,その最も小さい層に対して上述の処理が行われます.その結果がより大きい層に伝達され,低解像度の層と現在の層との色が大幅に異なる( >\texttt{sr} )位置のピクセルについてのみ,繰り返し計算が再実行されます.この結果,色領域の境界がより明確になります.ただし,ガウシアンピラミッドを用いて得られた結果は,入力画像全体に対してMean-Shift処理を実行(つまり, \texttt{max\_level}==0 )して得られるものとは異なることに注意してください.

cv::PyrSegmentation

void cvPyrSegmentation(IplImage* src, IplImage* dst, CvMemStorage* storage, CvSeq** comp, int level, double threshold1, double threshold2)

画像ピラミッドを利用したセグメンテーションを行います.

パラメタ:
  • src – 入力画像
  • dst – 出力画像
  • storage – ストレージ.結果として得られる連結成分のシーケンスが保存されます
  • comp – 出力シーケンスへのポインタ.その要素は,セグメント化された成分です
  • level – セグメンテーションに利用される画像ピラミッドの最大レベル
  • threshold1 – ピクセル同士の接続に利用される,誤差の閾値
  • threshold2 – セグメントのクラスタリングに利用される,誤差の閾値

この関数は,画像ピラミッドを利用した画像のセグメンテーションを行います.ここで,画像ピラミッドは,レベル level まで構築されます.レベル i にある任意のピクセル a と,隣のレベルにある親候補ピクセル b とは, p(c(a),c(b))<threshold1 の場合に接続されます.連結成分が定義されると,それらを繋げて複数のクラスタが形成されます. p(c(A),c(B))<threshold2 の場合,任意の 2つのセグメント A と B は同じクラスタに属します.入力画像がシングルチャンネルの場合は, p(c^1,c^2)=|c^1-c^2| となります. また,入力画像が3チャンネル(RGB)である場合は,

p(c^1,c^2) = 0.30 (c^1_r - c^2_r) +
               0.59 (c^1_g - c^2_g) +
               0.11 (c^1_b - c^2_b).

となります.

1つのクラスタに対して,1つ以上の連結成分が存在する可能性もあります.入出力画像 srcdst は,8ビット,シングルチャンネルか3チャンネル画像,そして両者が同じサイズでなければいけません.

cv::Threshold

double cvThreshold(const CvArr* src, CvArr* dst, double threshold, double maxValue, int thresholdType)

配列の要素に対して,ある定数での閾値処理を行います.

パラメタ:
  • src – 入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型)
  • dst – 出力配列. src と同じデータ型,あるいは8ビットでなければいけません
  • threshold – 閾値
  • maxValueCV_THRESH_BINARYCV_THRESH_BINARY_INV の場合に利用される,最大値の値
  • thresholdType – 閾値処理の種類(以下の説明を参照してください)

この関数は,シングルチャンネルの配列に対して,ある定数での閾値処理を行います.これは,グレースケールからの2値画像生成(関数 CmpS も,この目的に利用できます)や,ノイズ除去(つまり,小さすぎたり大きすぎたりする値を除きます)などに利用されることが多々あります.この関数がサポートする閾値処理にはいくつかの種類があり,それは引数 thresholdType によって決定されます:

  • CV_THRESH_BINARY

    \texttt{dst} (x,y) =  \fork{\texttt{maxValue}}{if $\texttt{src}(x,y) > \texttt{threshold}$}{0}{otherwise}

  • CV_THRESH_BINARY_INV

    \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{maxValue}}{otherwise}

  • CV_THRESH_TRUNC

    \texttt{dst} (x,y) =  \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{src}(x,y)}{otherwise}

  • CV_THRESH_TOZERO

    \texttt{dst} (x,y) =  \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{threshold}$}{0}{otherwise}

  • CV_THRESH_TOZERO_INV

    \texttt{dst} (x,y) =  \fork{0}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{src}(x,y)}{otherwise}

また,特殊な値 CV_THRESH_OTSU を上述のものと組み合わせて使うこともできます.この場合,関数は大津のアルゴリズムを用いて最適な閾値を決定し,それを引数 thresh で指定された値の代わりに利用します.また,この関数は,計算された閾値を返します.現在のところ,大津の手法は8ビット画像に対してのみ実装されています.

_images/threshold.png

目次

前のトピックへ

画像の幾何学変換

次のトピックへ

ヒストグラム

このページ