その他の画像変換 ======================== .. highlight:: python .. index:: AdaptiveThreshold cv::AdaptiveThreshold --------------------- .. function:: AdaptiveThreshold(src,dst,maxValue, adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, thresholdType=CV_THRESH_BINARY,blockSize=3,param1=5)-> None 配列に対して,適応的な閾値処理を行います. :param src: 入力配列 :type src: :class:`CvArr` :param dst: 出力配列 :type dst: :class:`CvArr` :param maxValue: ``CV_THRESH_BINARY`` と ``CV_THRESH_BINARY_INV`` の場合に利用される,最大値の値 :type maxValue: float :param adaptive_method: 適応的閾値処理で使用するアルゴリズム: ``CV_ADAPTIVE_THRESH_MEAN_C`` あるいは ``CV_ADAPTIVE_THRESH_GAUSSIAN_C`` (以下の説明を参照してください) :type adaptive_method: int :param threshold_type: 閾値処理の種類.以下のうちの1つ * **CV_THRESH_BINARY** xxx * **CV_THRESH_BINARY_INV** xxx :param blockSize: ピクセルに対する閾値を計算するために利用する,そのピクセルの近傍領域のサイズ:3,5,7,... :type blockSize: int :param param1: 利用する手法に依存するパラメータ.例えば, ``CV_ADAPTIVE_THRESH_MEAN_C`` と ``CV_ADAPTIVE_THRESH_GAUSSIAN_C`` の場合は,平均あるいは荷重平均から引かれる定数(説明を参照してください)を意味するが,負の値も取り得ます :type param1: float この関数は,次式に従いグレースケール画像を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 ------------ .. function:: CvtColor(src,dst,code)-> None 画像の色空間を変換します. :param src: 入力画像,8ビット(8u),16ビット(16u),あるいは単精度浮動小数点型(32f) :type src: :class:`CvArr` :param dst: 出力画像,入力が像と同じデータ型.チャンネル数は異なる可能性がある :type dst: :class:`CvArr` :param code: ``CV_ *src_color_space* 2 *dst_color_space*`` という定数を用いて指定する色変換処理(以下を参照してください) :type code: int この関数は,入力画像をある色空間から別の色空間へと変換します.これは, ``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 ----------------- .. function:: DistTransform(src,dst,distance_type=CV_DIST_L2,mask_size=3,mask=None,labels=NULL)-> None 入力画像中の非0ピクセルから,最も近い0ピクセルまでの距離を,全ての非0ピクセルに対して計算します. :param src: 8ビット,シングルチャンネル(2値)の入力画像 :type src: :class:`CvArr` :param dst: 求められた距離を値とする出力画像. ``src`` と同じサイズの,32ビット,浮動小数点型,シングルチャンネル画像 :type dst: :class:`CvArr` :param distance_type: 距離の種類. ``CV_DIST_L1, CV_DIST_L2`` あるいは ``CV_DIST_C`` :type distance_type: int :param mask_size: 距離変換マスクのサイズ.3 あるいは 5. ``CV_DIST_L1`` か ``CV_DIST_C`` の場合は,このパラメータは強制的に3になる. なぜなら,この場合 :math:`3\times 3` サイズのマスクは :math:`5\times 5` サイズのマスクと同じ結果で計算速度が速いからです :type mask_size: int :param mask: ユーザ定義の距離を計算する際に用いられるユーザ定義のマスク. :math:`3\times 3` マスクの場合は,2つの値(水平/垂直方向移動コスト,斜め移動コスト)で構成され, :math:`5\times 5` マスクの場合は,3つの値(水平/垂直方向移動コスト,斜め移動コスト,桂馬飛び移動コスト)で構成されます :type mask: sequence of int :param labels: オプション.整数型のラベルを要素にもつ2次元出力配列. ``src`` や ``dst`` と同じサイズです :type labels: :class:`CvArr` この関数は,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 --------------- .. class:: CvConnectedComp タプル (area, value, rect) で表現される連結成分.ここで, area は float で表現される連結性分の面積, value は :ref:`CvScalar` で表現される色の平均値,そして, rect は :ref:`CvRect` で表現される連結成分の ROI です. .. index:: FloodFill cv::FloodFill ------------- .. function:: FloodFill(image,seed_point,new_val,lo_diff=(0,0,0,0),up_diff=(0,0,0,0),flags=4,mask=NULL)-> comp 連結成分を指定した色で塗りつぶします. :param image: 入力画像.1あるいは3チャンネル,8ビットあるいは浮動小数点型.フラグ ``CV_FLOODFILL_MASK_ONLY`` が指定されている場合を除き,この関数によって書き換えられます(以下を参照してください) :type image: :class:`CvArr` :param seed_point: 連結成分の開始点 :type seed_point: :class:`CvPoint` :param new_val: 領域の塗りつぶしに使う新しいピクセル値 :type new_val: :class:`CvScalar` :param lo_diff: 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容下限値.8ビットカラー画像の場合は,packされた値 :type lo_diff: :class:`CvScalar` :param up_diff: 現在の対象ピクセルと,その連結成分に属する隣接ピクセルの1つとの間での,あるいは連結成分に追加されるシードピクセルとの間での,輝度値/色の差の許容上限値.8ビットカラー画像の場合は,packされた値 :type up_diff: :class:`CvScalar` :param comp: 関数によって返される,塗りつぶした領域の連結成分. この関数は, ``comp->contour`` フィールドを埋めないことに注意してください.塗りつぶした領域の境界線は, :ref:`FindContours` を利用して,出力されるマスク画像から得ることができます :type comp: :class:`CvConnectedComp` :param flags: 処理フラグ.下位ビットには,連結性を表す値である 4(デフォルト)あるいは 8 が含まれ,これらの値は関数内部で利用されます.この連結性は,どの隣接ピクセルを処理するべきかを定義します.上位ビットには,0 あるいは以下の値の組み合わせを含みます: * **CV_FLOODFILL_FIXED_RANGE** これが指定されている場合,現在のピクセルとシードピクセルとの間の差だけが考慮されます.指定されていなければ,隣接ピクセル同士の差が考慮されます(つまり,差の許容範囲が変動します) * **CV_FLOODFILL_MASK_ONLY** これが指定されている場合,この関数は画像を塗りつぶさずに(引数 ``new_val`` は無視されます),マスクを塗りつぶします(この場合は引数 mask がNULLであってはいけません) :type flags: int :param mask: オプション.シングルチャンネル,8ビットのマスク画像. ``image`` よりも,幅高さ共に2ピクセルずつ大きくなります.これが NULLではない場合,関数はこのマスク画像を利用し更新するので,ユーザは ``mask`` の中身をきちんと初期化しておかなければいけません.この塗りつぶしは,マスク画像中の0ではないピクセルを越えることはできません.例えば,エッジ検出の出力画像は,塗りつぶしをエッジ部分で堰き止めるためのマスク画像として利用できます.また,塗りつぶされる領域同士が重ならないよう,複数回の関数呼び出しで同じマスク画像を利用することができます. **注意** :マスク画像は塗りつぶされる画像よりも大きいので, ``image`` 中のピクセル :math:`(x,y)` に対応する ``mask`` 中のピクセルは :math:`(x+1,y+1)` となります :type mask: :class:`CvArr` この関数は,指定された色で連結成分を塗りつぶします.塗りつぶしは,シードピクセルから開始されます.連結しているかどうかは,ピクセル値同士の距離によって決まります. :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 ----------- .. function:: Inpaint(src,mask,dst,inpaintRadius,flags) -> None 選択領域内の画像を修復します. :param src: 入力画像.8ビット,1あるいは3チャンネル :type src: :class:`CvArr` :param mask: 8ビット,1チャンネルの修復マスク.非0のピクセルが,修復が必要な領域を表します :type mask: :class:`CvArr` :param dst: 出力画像.入力画像と同じフォーマット,同じサイズ :type dst: :class:`CvArr` :param inpaintRadius: 修復される点周りの円形の近傍領域の半径.これが,アルゴリズムに考慮されます :type inpaintRadius: float :param flags: 修復手法.以下のいずれか: * **CV_INPAINT_NS** ナビエ・ストークス(Navier-Stokes)ベースの手法 * **CV_INPAINT_TELEA** Alexandru Telea による手法 Telea04 :type flags: int この関数は,選択された画像領域を,その領域境界付近のピクセルを利用して再構成します.この関数は,スキャンされた写真からごみや傷を除去したり,静止画や動画から不要な物体を削除したりするために利用されます. .. index:: Integral cv::Integral ------------ .. function:: Integral(image,sum,sqsum=NULL,tiltedSum=NULL)-> None インテグラルイメージを求めます. :param image: 入力画像, :math:`W\times H` の8ビット,あるいは浮動小数点型(32f または 64f) :type image: :class:`CvArr` :param sum: インテグラルイメージ, :math:`(W+1)\times (H+1)` の32ビット整数,あるいは倍精度浮動小数点型(64f) :type sum: :class:`CvArr` :param sqsum: 各ピクセル値を2乗した画像に対するインテグラルイメージ, :math:`(W+1)\times (H+1)` の倍精度浮動小数点型(64f) :type sqsum: :class:`CvArr` :param tiltedSum: 45度傾けた画像に対するインテグラルイメージ, :math:`(W+1)\times (H+1)` で,データの型は ``sum`` と同様 :type tiltedSum: :class:`CvArr` 関数 ``cvIntegral`` は,入力画像に対する1つあるいは複数のインテグラルイメージを,次のように求めます: .. math:: \texttt{sum} (X,Y) = \sum _{x None Mean-Shift法による画像セグメンテーションを行います. :param src: 入力画像.8ビット,3チャンネル :type src: :class:`CvArr` :param dst: 出力画像.入力が像と同じフォーマット,同じサイズ :type dst: :class:`CvArr` :param sp: 空間窓の半径 :type sp: float :param sr: 色空間窓の半径 :type sr: float :param max_level: セグメンテーションに用いるピラミッドの最大レベル :type max_level: int :param termcrit: 終了条件:Mean-Shiftの反復をいつ止めるか :type termcrit: :class:`CvTermCriteria` この関数は,Mean-Shiftセグメンテーションのフィルタリング部分の実装です.つまり,この関数の出力は,色勾配と細かいピクセル値の平坦化というフィルタ処理がされた「ポスタライズド」な画像となります.この関数は,入力画像中(あるいは,ダウンサイジングされた入力画像中,下記参照)の各ピクセル :math:`(X,Y)` に対して,Mean-Shiftを繰り返します.つまり,空間-色を軸とする超空間内のピクセル :math:`(X,Y)` の近傍領域は,次のように表されます: .. math:: (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')`` が求められ,それらのベクトルは,次の繰り返しにおいて近傍領域の中心として扱われます: :math:`(X,Y)~(X',Y'), (R,G,B)~(R',G',B').` 反復計算終了後,最初のピクセル(つまり,繰り返し計算が開始された場所のピクセル)の色成分は,以下のような最終値(最後の繰り返しにおける平均色)にセットされます: :math:`I(X,Y) <- (R*,G*,B*)` :math:`\texttt{max\_level}>0` の場合,レベル :math:`\texttt{max\_level}+1` のガウシアンピラミッドが構成され,その最も小さい層に対して上述の処理が行われます.その結果がより大きい層に伝達され,低解像度の層と現在の層との色が大幅に異なる( :math:`>\texttt{sr}` )位置のピクセルについてのみ,繰り返し計算が再実行されます.この結果,色領域の境界がより明確になります.ただし,ガウシアンピラミッドを用いて得られた結果は,入力画像全体に対してMean-Shift処理を実行(つまり, :math:`\texttt{max\_level}==0` )して得られるものとは異なることに注意してください. .. index:: PyrSegmentation cv::PyrSegmentation ------------------- .. function:: PyrSegmentation(src,dst,storage,level,threshold1,threshold2)-> comp 画像ピラミッドを利用したセグメンテーションを行います. :param src: 入力画像 :type src: :class:`IplImage` :param dst: 出力画像 :type dst: :class:`IplImage` :param storage: ストレージ.結果として得られる連結成分のシーケンスが保存されます :type storage: :class:`CvMemStorage` :param comp: 出力シーケンスへのポインタ.その要素は,セグメント化された成分です :type comp: :class:`CvSeq` :param level: セグメンテーションに利用される画像ピラミッドの最大レベル :type level: int :param threshold1: ピクセル同士の接続に利用される,誤差の閾値 :type threshold1: float :param threshold2: セグメントのクラスタリングに利用される,誤差の閾値 :type threshold2: float この関数は,画像ピラミッドを利用した画像のセグメンテーションを行います.ここで,画像ピラミッドは,レベル ``level`` まで構築されます.レベル ``i`` にある任意のピクセル ``a`` と,隣のレベルにある親候補ピクセル ``b`` とは, :math:`p(c(a),c(b)) None 配列の要素に対して,ある定数での閾値処理を行います. :param src: 入力配列(シングルチャンネル,8ビット,あるいは32ビット浮動小数点型) :type src: :class:`CvArr` :param dst: 出力配列. ``src`` と同じデータ型,あるいは8ビットでなければいけません :type dst: :class:`CvArr` :param threshold: 閾値 :type threshold: float :param maxValue: ``CV_THRESH_BINARY`` と ``CV_THRESH_BINARY_INV`` の場合に利用される,最大値の値 :type maxValue: float :param thresholdType: 閾値処理の種類(以下の説明を参照してください) :type thresholdType: int この関数は,シングルチャンネルの配列に対して,ある定数での閾値処理を行います.これは,グレースケールからの2値画像生成(関数 :ref:`CmpS` も,この目的に利用できます)や,ノイズ除去(つまり,小さすぎたり大きすぎたりする値を除きます)などに利用されることが多々あります.この関数がサポートする閾値処理にはいくつかの種類があり,それは引数 ``thresholdType`` によって決定されます: * **CV_THRESH_BINARY** .. math:: \texttt{dst} (x,y) = \fork{\texttt{maxValue}}{if $\texttt{src}(x,y) > \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