その他の画像変換 ======================== .. highlight:: c .. index:: AdaptiveThreshold cv::AdaptiveThreshold --------------------- .. cfunction:: 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 ) 配列に対して,適応的な閾値処理を行います. :param src: 入力配列 :param dst: 出力配列 :param maxValue: ``CV_THRESH_BINARY`` と ``CV_THRESH_BINARY_INV`` の場合に利用される,最大値の値 :param adaptive_method: 適応的閾値処理で使用するアルゴリズム: ``CV_ADAPTIVE_THRESH_MEAN_C`` あるいは ``CV_ADAPTIVE_THRESH_GAUSSIAN_C`` (以下の説明を参照してください) :param threshold_type: 閾値処理の種類.以下のうちの1つ * **CV_THRESH_BINARY** xxx * **CV_THRESH_BINARY_INV** xxx :param blockSize: ピクセルに対する閾値を計算するために利用する,そのピクセルの近傍領域のサイズ:3,5,7,... :param param1: 利用する手法に依存するパラメータ.例えば, ``CV_ADAPTIVE_THRESH_MEAN_C`` と ``CV_ADAPTIVE_THRESH_GAUSSIAN_C`` の場合は,平均あるいは荷重平均から引かれる定数(説明を参照してください)を意味するが,負の値も取り得ます この関数は,次式に従いグレースケール画像を2値画像に変換します: * **CV_THRESH_BINARY** .. math:: dst(x,y) = \fork{\texttt{maxValue}}{if $src(x,y) > T(x,y)$}{0}{otherwise} * **CV_THRESH_BINARY_INV** .. math:: dst(x,y) = \fork{0}{if $src(x,y) > T(x,y)$}{\texttt{maxValue}}{otherwise} ここで, :math:`T(x,y)` は各ピクセルに対して個別に計算される閾値です. 手法 ``CV_ADAPTIVE_THRESH_MEAN_C`` の場合は, :math:`\texttt{block\_size} \times \texttt{block\_size}` ピクセルの近傍領域 の平均値から ``param1`` を引いた値です. また,手法 ``CV_ADAPTIVE_THRESH_GAUSSIAN_C`` の場合は, :math:`\texttt{block\_size} \times \texttt{block\_size}` ピクセルの近傍領域のガウシアンを重みとした総和から ``param1`` を引いた値です. .. index:: CvtColor cv::CvtColor ------------ .. cfunction:: void cvCvtColor( const CvArr* src, CvArr* dst, int code ) 画像の色空間を変換します. :param src: 入力画像,8ビット(8u),16ビット(16u),あるいは単精度浮動小数点型(32f) :param dst: 出力画像,入力が像と同じデータ型.チャンネル数は異なる可能性がある :param code: ``CV_ *src_color_space* 2 *dst_color_space*`` という定数を用いて指定する色変換処理(以下を参照してください) この関数は,入力画像をある色空間から別の色空間へと変換します.これは, ``IplImage`` のヘッダのフィールド ``colorModel`` と ``channelSeq`` を無視しますので,ユーザは入力画像の色空間を正しく指定しなければいけません(RGB空間の場合はチャンネルの順番も正しく指定してください.例えば,BGRは, :math:`B_0, G_0, R_0, B_1, G_1, R_1, ...` というレイアウトの24ビットフォーマットを表しており,RGBは, :math:`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)から/への変換,あるいはグレースケールから/への変換: .. math:: \text{RGB[A] to Gray:} Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B および .. math:: \text{Gray to RGB[A]:} R \leftarrow Y, G \leftarrow Y, B \leftarrow Y, A \leftarrow 0 RGB画像からグレースケールへの変換は,次のようになります: :: cvCvtColor(src ,bwsrc, CV_RGB2GRAY) .. * RGB :math:`\leftrightarrow` CIE XYZ ,Rec 709仕様,D65 白色点 ( ``CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB`` ): .. math:: \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} .. math:: \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} :math:`X` , :math:`Y` および :math:`Z` は,全範囲をカバーします(浮動小数点型の画像の場合, :math:`Z` は1を越える可能性があります). * RGB :math:`\leftrightarrow` YCrCb JPEG (a.k.a. YCC) ( ``CV_BGR2YCrCb, CV_RGB2YCrCb, CV_YCrCb2BGR, CV_YCrCb2RGB`` ) .. math:: Y \leftarrow 0.299 \cdot R + 0.587 \cdot G + 0.114 \cdot B .. math:: Cr \leftarrow (R-Y) \cdot 0.713 + delta .. math:: Cb \leftarrow (B-Y) \cdot 0.564 + delta .. math:: R \leftarrow Y + 1.403 \cdot (Cr - delta) .. math:: G \leftarrow Y - 0.344 \cdot (Cr - delta) - 0.714 \cdot (Cb - delta) .. math:: B \leftarrow Y + 1.773 \cdot (Cb - delta) ここで .. math:: 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 :math:`\leftrightarrow` HSV ( ``CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB`` ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます. .. math:: V \leftarrow max(R,G,B) .. math:: S \leftarrow \fork{\frac{V-min(R,G,B)}{V}}{if $V \neq 0$}{0}{otherwise} .. math:: 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$} もし :math:`H<0` ならば :math:`H \leftarrow H+360` 出力値の範囲は, :math:`0 \leq V \leq 1` , :math:`0 \leq S \leq 1` , :math:`0 \leq H \leq 360` です. これらの値は,出力されるべき型に変換されます: * 8ビット画像 .. math:: V \leftarrow 255 V, S \leftarrow 255 S, H \leftarrow H/2 \text{(to fit to 0 to 255)} * 16ビット画像 現在はサポートされていません .. math:: V <- 65535 V, S <- 65535 S, H <- H * 32ビット画像 H, S, V は,そのまま * RGB :math:`\leftrightarrow` HLS ( ``CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB`` ). 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます. .. math:: V_{max} \leftarrow {max}(R,G,B) .. math:: V_{min} \leftarrow {min}(R,G,B) .. math:: L \leftarrow \frac{V_{max} + V_{min}}{2} .. math:: 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$ } .. math:: 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$ } もし :math:`H<0` ならば :math:`H \leftarrow H+360` 出力の範囲は, :math:`0 \leq L \leq 1` , :math:`0 \leq S \leq 1` , :math:`0 \leq H \leq 360` です. これらの値は,出力されるべき型に変換されます: * 8ビット画像 .. math:: V \leftarrow 255 V, S \leftarrow 255 S, H \leftarrow H/2 \text{(to fit to 0 to 255)} * 16ビット画像 現在はサポートされていません .. math:: V <- 65535 V, S <- 65535 S, H <- H * 32ビット画像 H, S, V は,そのまま * RGB :math:`\leftrightarrow` CIE L*a*b* ( ``CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB`` ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます. .. math:: \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} .. math:: X \leftarrow X/X_n, \text{where} X_n = 0.950456 .. math:: Z \leftarrow Z/Z_n, \text{where} Z_n = 1.088754 .. math:: L \leftarrow \fork{116*Y^{1/3}-16}{for $Y>0.008856$}{903.3*Y}{for $Y \le 0.008856$} .. math:: a \leftarrow 500 (f(X)-f(Y)) + delta .. math:: b \leftarrow 200 (f(Y)-f(Z)) + delta ここで .. math:: f(t)= \fork{t^{1/3}}{for $t>0.008856$}{7.787 t+16/116}{for $t<=0.008856$} および .. math:: delta = \fork{128}{for 8-bit images}{0}{for floating-point images} となります. 出力の範囲は, :math:`0 \leq L \leq 100` , :math:`-127 \leq a \leq 127` , :math:`-127 \leq b \leq 127` です. これらの値は,出力されるべき型に変換されます: * 8ビット画像 .. math:: L \leftarrow L*255/100, a \leftarrow a + 128, b \leftarrow b + 128 * 16ビット画像 現在はサポートされていません * 32ビット画像 L, a, b は,そのまま * RGB :math:`\leftrightarrow` CIE L*u*v* ( ``CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB`` ) 8ビット および 16ビット画像の場合,R, G, B は浮動小数点型のフォーマットに変換され,0から1の範囲に収まるようにスケーリングされます. .. math:: \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} .. math:: L \leftarrow \fork{116 Y^{1/3}}{for $Y>0.008856$}{903.3 Y}{for $Y<=0.008856$} .. math:: u' \leftarrow 4*X/(X + 15*Y + 3 Z) .. math:: v' \leftarrow 9*Y/(X + 15*Y + 3 Z) .. math:: u \leftarrow 13*L*(u' - u_n) \quad \text{where} \quad u_n=0.19793943 .. math:: v \leftarrow 13*L*(v' - v_n) \quad \text{where} \quad v_n=0.46831096 出力の範囲は, :math:`0 \leq L \leq 100` , :math:`-134 \leq u \leq 220` , :math:`-140 \leq v \leq 122` です これらの値は,出力されるべき型に変換されます: * 8ビット画像 .. math:: 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 :math:`\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つのプレーンから,カラー画像を得ることができます. .. math:: \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`` :math:`C_1 C_2` ``2BGR`` と ``CV_Bayer`` :math:`C_1 C_2` ``2RGB`` に現れる2つの文字 :math:`C_1` と :math:`C_2` は,パターンの種類を表しています.つまり,この2文字は,あるパターンの2行目の2,3番目の成分であり,例えば,上述の図で表されたパターンは,まさに "BG" タイプです. .. index:: DistTransform cv::DistTransform ----------------- .. cfunction:: 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ピクセルに対して計算します. :param src: 8ビット,シングルチャンネル(2値)の入力画像 :param dst: 求められた距離を値とする出力画像. ``src`` と同じサイズの,32ビット,浮動小数点型,シングルチャンネル画像 :param distance_type: 距離の種類. ``CV_DIST_L1, CV_DIST_L2`` あるいは ``CV_DIST_C`` :param mask_size: 距離変換マスクのサイズ.3 あるいは 5. ``CV_DIST_L1`` か ``CV_DIST_C`` の場合は,このパラメータは強制的に3になる. なぜなら,この場合 :math:`3\times 3` サイズのマスクは :math:`5\times 5` サイズのマスクと同じ結果で計算速度が速いからです :param mask: ユーザ定義の距離を計算する際に用いられるユーザ定義のマスク. :math:`3\times 3` マスクの場合は,2つの値(水平/垂直方向移動コスト,斜め移動コスト)で構成され, :math:`5\times 5` マスクの場合は,3つの値(水平/垂直方向移動コスト,斜め移動コスト,桂馬飛び移動コスト)で構成されます :param labels: オプション.整数型のラベルを要素にもつ2次元出力配列. ``src`` や ``dst`` と同じサイズです この関数は,2値画像上の各ピクセルから,最も近い0ピクセルへの近似距離を求めます.これは,0ピクセルに対しては距離0をセットし,その他のピクセルに対しては,基本移動の組み合わせで0ピクセルに至るまでの最短距離を見つけます.基本移動は,水平,垂直,斜め,桂馬飛び(これは :math:`5\times 5` サイズのマスクを利用した場合のみ)移動であり,全長距離は,これらの基本移動距離の合計となります.距離関数は対称性をもつはずなので,水平および垂直移動のコスト(これを ``a`` で表す)は全て等しくなければいけません.同様に,斜め移動のコスト(これを ``b`` で表す)も全て等しく,桂馬飛び移動のコスト(これを ``c`` で表す)も全て等しくなくてはいけません.距離の種類が ``CV_DIST_C`` や ``CV_DIST_L1`` の場合,距離は正確に計算されますが, ``CV_DIST_L2`` (ユークリッド距離)の場合は,距離はいくらかの相対誤差( :math:`5\times 5` マスクを用いると精度が向上します)を持ちます.OpenCVでは,次のように Borgefors86 で推奨される値を利用しています: .. table:: ============== =================== ====================== ``CV_DIST_C`` :math:`(3\times 3)` a = 1, b = 1 \ ============== =================== ====================== ``CV_DIST_L1`` :math:`(3\times 3)` a = 1, b = 2 \ ``CV_DIST_L2`` :math:`(3\times 3)` a=0.955, b=1.3693 \ ``CV_DIST_L2`` :math:`(5\times 5)` a=1, b=1.4, c=2.1969 \ ============== =================== ====================== 以下は,ユーザ定義距離を利用した場合の,距離フィールド(白い矩形の中心に黒(0)ピクセルがある)の例です: ユーザ定義 :math:`3 \times 3` マスク (a=1, b=1.5) .. table:: === === === = === === ===== 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 \ === === === = === === ===== ユーザ定義 :math:`5 \times 5` マスク (a=1, b=1.5, c=2) .. table:: === === === = === === ===== 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`` では :math:`3\times 3` のマスクが利用され,より正確な距離推定 ``CV_DIST_L2`` では :math:`5\times 5` のマスクが利用されます. 出力パラメータ ``labels`` が ``NULL`` ではない場合,この関数は,全ての0非ピクセルに対して最も近い値0の連結成分を求めます.この連結成分自体は,関数処理の最初で輪郭として検出されます. このモードでは,処理時間がたかだか O(N) (Nはピクセル数)なので,これを利用すると,2値画像に対する近似的なボロノイ図を高速に求めることができます. .. index:: CvConnectedComp .. _CvConnectedComp: CvConnectedComp --------------- .. ctype:: CvConnectedComp :: typedef struct CvConnectedComp { double area; /* セグメント化された連結成分の面積 */ CvScalar value; /* 連結成分の平均色 */ CvRect rect; /* セグメント化された連結成分の ROI */ CvSeq* contour; /* オプションである連結成分の境界 (その輪郭は,「穴」に相当するような子輪郭を持つ可能性があります) */ } CvConnectedComp; .. .. index:: FloodFill cv::FloodFill ------------- .. cfunction:: 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 ) 連結成分を指定した色で塗りつぶします. :param image: 入力画像.1あるいは3チャンネル,8ビットあるいは浮動小数点型.フラグ ``CV_FLOODFILL_MASK_ONLY`` が指定されている場合を除き,この関数によって書き換えられます(以下を参照してください) :param seed_point: 連結成分の開始点 :param new_val: 領域の塗りつぶしに使う新しいピクセル値 :param lo_diff: 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容下限値.8ビットカラー画像の場合は,packされた値 :param up_diff: 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容上限値.8ビットカラー画像の場合は,packされた値 :param comp: 塗りつぶした領域に関する情報を代入する構造体へのポインタ. この関数は, ``comp->contour`` フィールドを埋めないことに注意してください.塗りつぶした領域の境界線は, :ref:`FindContours` を利用して,出力されるマスク画像から得ることができます :param flags: 処理フラグ.下位ビットには,連結性を表す値である 4(デフォルト)あるいは 8 が含まれ,これらの値は関数内部で利用されます.この連結性は,どの隣接ピクセルを処理するべきかを定義します.上位ビットには,0 あるいは以下の値の組み合わせを含みます: * **CV_FLOODFILL_FIXED_RANGE** これが指定されている場合,現在のピクセルとシードピクセルとの間の差だけが考慮されます.指定されていなければ,隣接ピクセル同士の差が考慮されます(つまり,差の許容範囲が変動します) * **CV_FLOODFILL_MASK_ONLY** これが指定されている場合,この関数は画像を塗りつぶさずに(引数 ``new_val`` は無視されます),マスクを塗りつぶします(この場合は引数 mask がNULLであってはいけません) :param mask: オプション.シングルチャンネル,8ビットのマスク画像. ``image`` よりも,幅高さ共に2ピクセルずつ大きくなります.これが NULLではない場合,関数はこのマスク画像を利用し更新するので,ユーザは ``mask`` の中身をきちんと初期化しておかなければいけません.この塗りつぶしは,マスク画像中の0ではないピクセルを越えることはできません.例えば,エッジ検出の出力画像は,塗りつぶしをエッジ部分で堰き止めるためのマスク画像として利用できます.また,塗りつぶされる領域同士が重ならないよう,複数回の関数呼び出しで同じマスク画像を利用することができます. **注意** :マスク画像は塗りつぶされる画像よりも大きいので, ``image`` 中のピクセル :math:`(x,y)` に対応する ``mask`` 中のピクセルは :math:`(x+1,y+1)` となります この関数は,指定された色で連結成分を塗りつぶします.塗りつぶしは,シードピクセルから開始されます.連結しているかどうかは,ピクセル値同士の距離によって決まります. :math:`(x,y)` のピクセルが塗りつぶされる領域に属していると見なされるのは,以下の場合です: * グレースケール画像,変動範囲 .. math:: src(x',y')- \texttt{lo\_diff} <= src(x,y) <= src(x',y')+ \texttt{up\_diff} * グレースケール画像,固定範囲 .. math:: src(seed.x,seed.y)- \texttt{lo\_diff} <=src(x,y)<=src(seed.x,seed.y)+ \texttt{up\_diff} * カラー画像,変動範囲 .. math:: src(x',y')_r- \texttt{lo\_diff} _r<=src(x,y)_r<=src(x',y')_r+ \texttt{up\_diff} _r .. math:: src(x',y')_g- \texttt{lo\_diff} _g<=src(x,y)_g<=src(x',y')_g+ \texttt{up\_diff} _g .. math:: src(x',y')_b- \texttt{lo\_diff} _b<=src(x,y)_b<=src(x',y')_b+ \texttt{up\_diff} _b * カラー画像,固定範囲 .. math:: src(seed.x,seed.y)_r- \texttt{lo\_diff} _r<=src(x,y)_r<=src(seed.x,seed.y)_r+ \texttt{up\_diff} _r .. math:: src(seed.x,seed.y)_g- \texttt{lo\_diff} _g<=src(x,y)_g<=src(seed.x,seed.y)_g+ \texttt{up\_diff} _g .. math:: src(seed.x,seed.y)_b- \texttt{lo\_diff} _b<=src(x,y)_b<=src(seed.x,seed.y)_b+ \texttt{up\_diff} _b ここで, :math:`src(x',y')` は,ある隣接ピクセルのピクセル値を表します.つまり,対象ピクセルの色/輝度値が,次の値に十分近い場合に連結成分に追加されます: * 変動範囲の場合:既に連結成分に属する隣接ピクセルの色/輝度値 * 固定範囲の場合:シードピクセルの色/輝度値. .. index:: Inpaint cv::Inpaint ----------- .. cfunction:: void cvInpaint( const CvArr* src, const CvArr* mask, CvArr* dst, double inpaintRadius, int flags) 選択領域内の画像を修復します. :param src: 入力画像.8ビット,1あるいは3チャンネル :param mask: 8ビット,1チャンネルの修復マスク.非0のピクセルが,修復が必要な領域を表します :param dst: 出力画像.入力画像と同じフォーマット,同じサイズ :param inpaintRadius: 修復される点周りの円形の近傍領域の半径.これが,アルゴリズムに考慮されます :param flags: 修復手法.以下のいずれか: * **CV_INPAINT_NS** ナビエ・ストークス(Navier-Stokes)ベースの手法 * **CV_INPAINT_TELEA** Alexandru Telea による手法 Telea04 この関数は,選択された画像領域を,その領域境界付近のピクセルを利用して再構成します.この関数は,スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするために利用されます. .. index:: Integral cv::Integral ------------ .. cfunction:: void cvIntegral( const CvArr* image, CvArr* sum, CvArr* sqsum=NULL, CvArr* tiltedSum=NULL ) インテグラルイメージを求めます. :param image: 入力画像, :math:`W\times H` の8ビット,あるいは浮動小数点型(32f または 64f) :param sum: インテグラルイメージ, :math:`(W+1)\times (H+1)` の32ビット整数,あるいは倍精度浮動小数点型(64f) :param sqsum: 各ピクセル値を2乗した画像に対するインテグラルイメージ, :math:`(W+1)\times (H+1)` の倍精度浮動小数点型(64f) :param tiltedSum: 45度傾けた画像に対するインテグラルイメージ, :math:`(W+1)\times (H+1)` で,データの型は ``sum`` と同様 関数 ``cvIntegral`` は,入力画像に対する1つあるいは複数のインテグラルイメージを,次のように求めます: .. math:: \texttt{sum} (X,Y) = \sum _{x0` の場合,レベル :math:`\texttt{max\_level}+1` のガウシアンピラミッドが構成され,その最も小さい層に対して上述の処理が行われます.その結果がより大きい層に伝達され,低解像度の層と現在の層との色が大幅に異なる( :math:`>\texttt{sr}` )位置のピクセルについてのみ,繰り返し計算が再実行されます.この結果,色領域の境界がより明確になります.ただし,ガウシアンピラミッドを用いて得られた結果は,入力画像全体に対してMean-Shift処理を実行(つまり, :math:`\texttt{max\_level}==0` )して得られるものとは異なることに注意してください. .. index:: PyrSegmentation cv::PyrSegmentation ------------------- .. cfunction:: void cvPyrSegmentation( IplImage* src, IplImage* dst, CvMemStorage* storage, CvSeq** comp, int level, double threshold1, double threshold2 ) 画像ピラミッドを利用したセグメンテーションを行います. :param src: 入力画像 :param dst: 出力画像 :param storage: ストレージ.結果として得られる連結成分のシーケンスが保存されます :param comp: 出力シーケンスへのポインタ.その要素は,セグメント化された成分です :param level: セグメンテーションに利用される画像ピラミッドの最大レベル :param threshold1: ピクセル同士の接続に利用される,誤差の閾値 :param threshold2: セグメントのクラスタリングに利用される,誤差の閾値 この関数は,画像ピラミッドを利用した画像のセグメンテーションを行います.ここで,画像ピラミッドは,レベル ``level`` まで構築されます.レベル ``i`` にある任意のピクセル ``a`` と,隣のレベルにある親候補ピクセル ``b`` とは, :math:`p(c(a),c(b)) \texttt{threshold}$}{0}{otherwise} * **CV_THRESH_BINARY_INV** .. math:: \texttt{dst} (x,y) = \fork{0}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{maxValue}}{otherwise} * **CV_THRESH_TRUNC** .. math:: \texttt{dst} (x,y) = \fork{\texttt{threshold}}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{src}(x,y)}{otherwise} * **CV_THRESH_TOZERO** .. math:: \texttt{dst} (x,y) = \fork{\texttt{src}(x,y)}{if $\texttt{src}(x,y) > \texttt{threshold}$}{0}{otherwise} * **CV_THRESH_TOZERO_INV** .. math:: \texttt{dst} (x,y) = \fork{0}{if $\texttt{src}(x,y) > \texttt{threshold}$}{\texttt{src}(x,y)}{otherwise} また,特殊な値 ``CV_THRESH_OTSU`` を上述のものと組み合わせて使うこともできます.この場合,関数は大津のアルゴリズムを用いて最適な閾値を決定し,それを引数 ``thresh`` で指定された値の代わりに利用します.また,この関数は,計算された閾値を返します.現在のところ,大津の手法は8ビット画像に対してのみ実装されています. .. image:: ../../pics/threshold.png