ヒストグラム ================== .. highlight:: python .. index:: CvHistogram .. _CvHistogram: CvHistogram ----------- `id=0.780712880929 Comments from the Wiki `__ .. class:: CvHistogram 多次元ヒストグラム. CvHistogram は,関数 :ref:`CreateHist` によって作成される多次元ヒストグラムです.これは,ヒストグラムカウントを格納する :ref:`CvMatND` 型の ``ビン`` を持ちます. .. index:: CalcBackProject .. _CalcBackProject: CalcBackProject --------------- `id=0.182807378794 Comments from the Wiki `__ .. function:: CalcBackProject(image,back_project,hist)-> None バックプロジェクションを計算します. :param image: 入力画像(CvMat** の形式で渡される場合もあります). :type image: sequence of :class:`IplImage` :param back_project: 入力画像と同じ型のバックプロジェクション画像. :type back_project: :class:`CvArr` :param hist: ヒストグラム. :type hist: :class:`CvHistogram` 関数 ``cvCalcBackProject`` は,ヒストグラムのバックプロジェクションを求めます.この関数は,すべての入力画像(シングルチャンネル)上の同じ位置にあるピクセルのタプルに対して,そのタプルに対応したヒストグラムのビンの値を,出力画像のピクセル値としてセットします.統計学的には,出力画像の各ピクセル値は,与えられた分布(ヒストグラム)における観測タプルの出現確率であると言えます.例えば,画像中の赤い物体を見つけるためには,以下のような方法が考えられます: #. 画像にその物体だけが写っていると仮定し,その赤いオブジェクトの色相に関するヒストグラムを計算します.このヒストグラムは赤色に対して強い最大値を持つ傾向があります. #. ヒストグラムを利用し,物体を探索する画像の色相平面のバックプロジェクションを求めます.そして,その画像に閾値処理を施します. #. その結果画像から連結成分を探し,別の基準(例えば,最大の連結成分など)を利用して正しい成分を選択します. これは,3番目のステップ以外は,Camshiftの色物体追跡器のアルゴリズムとほぼ同じです.Camshift追跡器では,この3番目のステップの代わりにCAMSHIFTアルゴリズムが用いられ,物体の前ステップでの位置が与えられると,バックプロジェクション上の物体の現在位置が求められます. .. index:: CalcBackProjectPatch .. _CalcBackProjectPatch: CalcBackProjectPatch -------------------- `id=0.0825416169531 Comments from the Wiki `__ .. function:: CalcBackProjectPatch(images,dst,patch_size,hist,method,factor)-> None ヒストグラムを比較することで,画像中のテンプレート位置を求めます. :param images: 入力画像(CvMat** の形式で渡される場合もあります). :type images: sequence of :class:`IplImage` :param dst: 出力画像. :type dst: :class:`CvArr` :param patch_size: 入力画像上を移動するパッチのサイズ. :type patch_size: :class:`CvSize` :param hist: ヒストグラム. :type hist: :class:`CvHistogram` :param method: 比較手法.この値は :ref:`CompareHist` に渡されます(この関数の説明を参照してください). :type method: int :param factor: ヒストグラムの正規化係数.出力画像の正規化スケールに影響します.分からない場合には1を与えてください. :type factor: float 関数 ``cvCalcBackProjectPatch`` は,与えられたヒストグラムと,入力画像の一部分のヒストグラムとを比較することで,バックプロジェクションを計算します.配列 ``image`` は,ある画像のROIを様々な方法で評価した結果から構成されます.その評価結果には,色相, ``x`` 方向微分, ``y`` 方向微分,ラプラシアンフィルタ,Gaborフィルタなどが考えられます(1つでも構いません).各手法の評価出力は,個別に集められてそれぞれ別の画像となります.画像配列 ``image`` は,これらの評価画像の集合です.また,多次元ヒストグラム ``hist`` は,画像配列 ``image`` からサンプリングした結果です.最終的なヒストグラムは,正規化されます.また,ヒストグラム ``hist`` は,配列 ``image`` の要素数と同じだけの次元を持ちます. 新しい画像はまず評価され,そのROI全体が画像配列 ``image`` に変換されます.その部分的なヒストグラムは,以下の図にあるように,中心にアンカーを持つ「パッチ」と重なった部分にある画像 ``image`` から計算されます. ``hist`` と比較できるように,このヒストグラムは,パラメータ ``norm_factor`` を利用して正規化されます.求められたヒストグラムは,比較手法に ``method`` を指定した関数 ``cvCompareHist`` を利用して,モデルヒストグラム ``hist`` と比較されます.その出力結果は,確率画像 ``dst`` の,パッチのアンカーに対応する場所に格納されます.毎回パッチをずらして,最終的にROI全体に対して処理が終わるまで,これを繰り返します.ヒストグラムの反復更新は,パッチの端の重ならなくなった部分のピクセル値を引き,さらに新しく重なる部分のピクセル値を加えることで,大幅に処理を削減できます.しかし,まだこれは実装されていません. パッチによる投影計算 .. image:: ../../pics/backprojectpatch.png .. index:: CalcHist .. _CalcHist: CalcHist -------- `id=0.0527640411059 Comments from the Wiki `__ .. function:: CalcHist(image,hist,accumulate=0,mask=NULL)-> None 画像のヒストグラムを求めます. :param image: 入力画像(CvMat** の形式で渡される場合もあります). :type image: sequence of :class:`IplImage` :param hist: ヒストグラムへのポインタ. :type hist: :class:`CvHistogram` :param accumulate: 累積フラグ.これが指定されている場合,関数の最初でヒストグラムがクリアされません.これによって,複数の画像から1つのヒストグラムを計算したり,毎回ヒストグラムを更新したりすることができます. :type accumulate: int :param mask: 処理マスク.入力画像のどのピクセルをカウントするかを決めます. :type mask: :class:`CvArr` この関数は,1つあるいは複数のシングルチャンネル画像のヒストグラムを求めます.ヒストグラムのビンの値を増加させる入力タプルの要素は,対応する(複数の)入力画像の同じ位置から取り出されます. .. include:: /home/idojun/Dropbox/doc_jp_roscv/python_fragments/calchist.py :literal: .. index:: CalcProbDensity .. _CalcProbDensity: CalcProbDensity --------------- `id=0.119384230218 Comments from the Wiki `__ .. function:: CalcProbDensity(hist1,hist2,dst_hist,scale=255)-> None あるヒストグラムを別のヒストグラムで割ります. :param hist1: 1 番目のヒストグラム(除数). :type hist1: :class:`CvHistogram` :param hist2: 2 番目のヒストグラム. :type hist2: :class:`CvHistogram` :param dst_hist: 出力ヒストグラム. :type dst_hist: :class:`CvHistogram` :param scale: 出力ヒストグラムに対するスケール係数. :type scale: float この関数は,2つのヒストグラムから物体の確率密度を求めます: .. math:: \texttt{dist\_hist} (I)= \forkthree{0}{if $\texttt{hist1}(I)=0$}{\texttt{scale}}{if $\texttt{hist1}(I) \ne 0$ and $\texttt{hist2}(I) > \texttt{hist1}(I)$}{\frac{\texttt{hist2}(I) \cdot \texttt{scale}}{\texttt{hist1}(I)}}{if $\texttt{hist1}(I) \ne 0$ and $\texttt{hist2}(I) \le \texttt{hist1}(I)$} 出力ヒストグラムのビンの値は, ``scale`` 未満になります. .. index:: ClearHist .. _ClearHist: ClearHist --------- `id=0.0675807300777 Comments from the Wiki `__ .. function:: ClearHist(hist)-> None ヒストグラムをクリアします. :param hist: ヒストグラム. :type hist: :class:`CvHistogram` この関数は,密な配列データをもつヒストグラムの場合はヒストグラムのすべてのビンの値を 0にし,疎な配列データを持つヒストグラムの場合はヒストグラムのすべてのビンを削除します. .. index:: CompareHist .. _CompareHist: CompareHist ----------- `id=0.382307085372 Comments from the Wiki `__ .. function:: CompareHist(hist1,hist2,method)->float 2つの密なヒストグラムを比較します. :param hist1: 1 番目の密なヒストグラム. :type hist1: :class:`CvHistogram` :param hist2: 2 番目の密なヒストグラム. :type hist2: :class:`CvHistogram` :param method: 比較手法.以下のうちの1つ: * **CV_COMP_CORREL** 相関 * **CV_COMP_CHISQR** カイ2乗 * **CV_COMP_INTERSECT** 交差 * **CV_COMP_BHATTACHARYYA** Bhattacharyya距離 :type method: int この関数は,指定された手法を用いて2つの密なヒストグラムを比較します( :math:`H_1` は1番目のヒストグラムを, :math:`H_2` は2番目のヒストグラムを表します): * 相関 (method=CV\_COMP\_CORREL) .. math:: d(H_1,H_2) = \frac{\sum_I (H'_1(I) \cdot H'_2(I))}{\sqrt{\sum_I(H'_1(I)^2) \cdot \sum_I(H'_2(I)^2)}} ここで, .. math:: H'_k(I) = \frac{H_k(I) - 1}{N \cdot \sum_J H_k(J)} です.N はヒストグラムのビン数を表します. * カイ2乗 (method=CV\_COMP\_CHISQR) .. math:: d(H_1,H_2) = \sum _I \frac{(H_1(I)-H_2(I))^2}{H_1(I)+H_2(I)} * 交差 (method=CV\_COMP\_INTERSECT) .. math:: d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I)) * Bhattacharyya距離 (method=CV\_COMP\_BHATTACHARYYA) .. math:: d(H_1,H_2) = \sqrt{1 - \sum_I \frac{\sqrt{H_1(I) \cdot H_2(I)}}{ \sqrt{ \sum_I H_1(I) \cdot \sum_I H_2(I) }}} この関数は, :math:`d(H_1, H_2)` を返します. 注意:手法 ``CV_COMP_BHATTACHARYYA`` は,正規化されたヒストグラムでのみ動作します. 疎なヒストグラム,あるいはより一般的な構造である重み付き点群などを比較するためには,関数 :ref:`CalcEMD2` の利用を検討してください. .. index:: CreateHist .. _CreateHist: CreateHist ---------- `id=0.226077218717 Comments from the Wiki `__ .. function:: CreateHist(dims, type, ranges, uniform = 1) -> hist ヒストグラムを作成します. :param dims: N次元ヒストグラムに対して,各次元のサイズを与える長さNのリスト. :type dims: sequence of int :param type: ヒストグラム表現フォーマット: ``CV_HIST_ARRAY`` は,ヒストグラムのデータが密な多次元配列 CvMatND で表現される事を意味します.また ``CV_HIST_SPARSE`` は,ヒストグラムのデータが疎な多次元配列 CvSparseMat で表される事を意味します. :type type: int :param ranges: ヒストグラムのビンの範囲を示す配列.これの意味は,パラメータ ``uniform`` の値に依存します.これらの範囲は,ヒストグラムが計算される際や,どのヒストグラムのビンが入力画像中のどの値(あるいは,値のタプル)に対応するかを決定するバックプロジェクションの際に利用されます. :type ranges: list of tuples of ints :param uniform: 一様性を示すフラグ.これが0ではない場合,ヒストグラムは等間隔のビンをもち, ``ranges[i]`` :math:`0<=i`__ .. function:: GetMinMaxHistValue(hist)-> (min_value,max_value,min_idx,max_idx) 最小値を持つビン,および最大値を持つビンを求めます. :param hist: ヒストグラムへのポインタ. :type hist: :class:`CvHistogram` :param min_value: ヒストグラムの最小値. :type min_value: :class:`CvScalar` :param max_value: ヒストグラムの最大値. :type max_value: :class:`CvScalar` :param min_idx: 最小値の座標. :type min_idx: sequence of int :param max_idx: 最大値の座標. :type max_idx: sequence of int この関数は,最小値を持つビン,および最大値を持つビンとそれぞれの位置を求めます.出力に利用されるすべての引数は,オプションです.最小値や最大値が同値で複数存在する場合,(辞書順に並べた場合の)最小のインデックスを持つものが返されます. .. index:: NormalizeHist .. _NormalizeHist: NormalizeHist ------------- `id=0.869991986844 Comments from the Wiki `__ .. function:: NormalizeHist(hist,factor)-> None ヒストグラムを正規化します. :param hist: ヒストグラムへのポインタ. :type hist: :class:`CvHistogram` :param factor: 正規化ファクタ. :type factor: float この関数は,ビンの値の合計が ``factor`` と等しくなるようにスケーリングを行うことで,ヒストグラムのビンの正規化を行います. .. index:: QueryHistValue_1D .. _QueryHistValue_1D: QueryHistValue_1D ----------------- `id=0.376568621425 Comments from the Wiki `__ .. function:: QueryHistValue_1D(hist, idx0) -> float 1次元ヒストグラムビンの値を返します. :param hist: ヒストグラムへのポインタ. :type hist: :class:`CvHistogram` :param idx0: ビンのインデックス0. :type idx0: int .. index:: QueryHistValue_2D .. _QueryHistValue_2D: QueryHistValue_2D ----------------- `id=0.180084600873 Comments from the Wiki `__ .. function:: QueryHistValue_2D(hist, idx0, idx1) -> float 2次元ヒストグラムのビンの値を返します. :param hist: ヒストグラム. :type hist: :class:`CvHistogram` :param idx0: ビンのインデックス0. :type idx0: int :param idx1: ビンのインデックス1. :type idx1: int .. index:: QueryHistValue_3D .. _QueryHistValue_3D: QueryHistValue_3D ----------------- `id=0.43541026107 Comments from the Wiki `__ .. function:: QueryHistValue_3D(hist, idx0, idx1, idx2) -> float 3次元ヒストグラムのビンの値を返します. :param hist: ヒストグラム. :type hist: :class:`CvHistogram` :param idx0: ビンのインデックス0. :type idx0: int :param idx1: ビンのインデックス1. :type idx1: int :param idx2: ビンのインデックス2. :type idx2: int .. index:: QueryHistValue_nD .. _QueryHistValue_nD: QueryHistValue_nD ----------------- `id=0.609415150493 Comments from the Wiki `__ .. function:: QueryHistValue_nD(hist, idx) -> float n次元ヒストグラムのビンの値を返します. :param hist: ヒストグラム. :type hist: :class:`CvHistogram` :param idx: インデックスのリスト.この長さは,ヒストグラムのビンの次元と同じです. :type idx: sequence of int .. index:: ThreshHist .. _ThreshHist: ThreshHist ---------- `id=0.491677659677 Comments from the Wiki `__ .. function:: ThreshHist(hist,threshold)-> None ヒストグラムの閾値処理を行います. :param hist: ヒストグラムへのポインタ. :type hist: :class:`CvHistogram` :param threshold: 閾値レベル. :type threshold: float この関数は,指定した閾値以下のビンをクリアします.