OpenCV 4.5.3(日本語機械翻訳)
クラス | 列挙型 | 関数 | 変数
Imgproc_hist

クラス

class cv::CLAHE
Contrast Limited Adaptive Histogram Equalizationの基底クラスです.[【詳解】(英語]

列挙型

enum cv::HistCompMethods {
cv::HISTCMP_CORREL = 0 , cv::HISTCMP_CHISQR = 1 , cv::HISTCMP_INTERSECT = 2 , cv::HISTCMP_BHATTACHARYYA = 3 ,
cv::HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA , cv::HISTCMP_CHISQR_ALT = 4 , cv::HISTCMP_KL_DIV = 5
}

関数

CV_EXPORTS void cv::calcHist (const Mat *images, int nimages, const int *channels, InputArray mask, OutputArray hist, int dims, const int *histSize, const float **ranges, bool uniform=true, bool accumulate=false)
配列の集合のヒストグラムを計算します.[【詳解】(英語]
CV_EXPORTS void cv::calcHist (const Mat *images, int nimages, const int *channels, InputArray mask, SparseMat &hist, int dims, const int *histSize, const float **ranges, bool uniform=true, bool accumulate=false)
CV_EXPORTS_W void cv::calcHist (InputArrayOfArrays images, const std::vector< int > &channels, InputArray mask, OutputArray hist, const std::vector< int > &histSize, const std::vector< float > &ranges, bool accumulate=false)
CV_EXPORTS void cv::calcBackProject (const Mat *images, int nimages, const int *channels, InputArray hist, OutputArray backProject, const float **ranges, double scale=1, bool uniform=true)
ヒストグラムのバックプロジェクションを計算します.[【詳解】(英語]
CV_EXPORTS void cv::calcBackProject (const Mat *images, int nimages, const int *channels, const SparseMat &hist, OutputArray backProject, const float **ranges, double scale=1, bool uniform=true)
CV_EXPORTS_W void cv::calcBackProject (InputArrayOfArrays images, const std::vector< int > &channels, InputArray hist, OutputArray dst, const std::vector< float > &ranges, double scale)
CV_EXPORTS_W double cv::compareHist (InputArray H1, InputArray H2, int method)
2つのヒストグラムを比較します.[【詳解】(英語]
CV_EXPORTS double cv::compareHist (const SparseMat &H1, const SparseMat &H2, int method)
CV_EXPORTS_W void cv::equalizeHist (InputArray src, OutputArray dst)
グレースケール画像のヒストグラムを均等化します.[【詳解】(英語]
CV_EXPORTS_W Ptr< CLAHE > cv::createCLAHE (double clipLimit=40.0, Size tileGridSize=Size(8, 8))
オブジェクトへのスマート ポインタを作成し、初期化します。cv::CLAHEクラスを作成し,それを初期化します.[【詳解】(英語]
CV_EXPORTS float cv::EMD (InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), float *lowerBound=0, OutputArray flow=noArray())
2つの重み付けされた点配置間の「最小作業」距離を計算します.[【詳解】(英語]
cv::CV_EXPORTS_AS (EMD) float wrapperEMD(InputArray signature1

変数

InputArray cv::signature2
InputArray int cv::distType
InputArray int InputArray cv::cost =noArray()
InputArray int InputArray CV_IN_OUT Ptr< float > cv::lowerBound = Ptr<float>()
InputArray int InputArray CV_IN_OUT Ptr< float > OutputArray cv::flow = noArray() )

詳解

列挙型詳解

HistCompMethods

ヒストグラム比較法

列挙値
HISTCMP_CORREL

相関関係

\[d(H_1,H_2) = \frac{\sum_I (H_1(I) - \bar{H_1}) (H_2(I) - \bar{H_2})}{\sqrt{\sum_I(H_1(I) - \bar{H_1})^2 \sum_I(H_2(I) - \bar{H_2})^2}}\]

ここで

\[\bar{H_k} = \frac{1}{N} \sum _J H_k(J)\]

および$N$は、ヒストグラムのビンの総数

HISTCMP_CHISQR

カイ二乗

\[d(H_1,H_2) = \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)}\]

HISTCMP_INTERSECT

交差点

\[d(H_1,H_2) = \sum _I \min (H_1(I), H_2(I))\]

histcmp_bhattacharyya

Bhattacharyya距離 (実際,OpenCVではHellinger距離が計算されますが,これはBhattacharyya係数と関連しています.)

\[d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}\]

HISTCMP_HELLINGER

HISTCMP_BHATTACHARYYA のシノニム.

HISTCMP_CHISQR_ALT

代替カイ二乗

\[d(H_1,H_2) = 2 * \sum _I \frac{\left(H_1(I)-H_2(I)\right)^2}{H_1(I)+H_2(I)}\]

この代替式はテクスチャ比較によく使われます。例えば[Puzicha1997] を参照してください。

HISTCMP_KL_DIV

Kullback-Leibler ダイバージェンス

\[d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)\]

関数詳解

calcBackProject() [1/3]

CV_EXPORTS void cv::calcBackProject ( const Mat * images,
int nimages,
const int * channels,
const SparseMat & hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

calcBackProject() [2/3]

CV_EXPORTS void cv::calcBackProject ( const Mat * images,
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true
)

ヒストグラムのバックプロジェクションを計算します.

この関数はcv::calcBackProjectは,ヒストグラムのバックプロジェクションを計算します.つまり,以下と同様にcalcHistと同様に,この関数は,各位置(x, y)において,入力画像の選択されたチャンネルの値を収集し,それに対応するヒストグラムのビンを求めます.しかし,この関数は,ビンの値をインクリメントするのではなく,ビンの値を読み込み,それを scale でスケーリングして backProject(x,y) に格納します.統計学の観点から言えば,この関数は,ヒストグラムで表される経験的な確率分布に関する各要素の値の確率を計算します.例えば,シーンの中の明るい色の物体を見つけて追跡する方法を見てみましょう.

  • 追尾する前に、対象物がフレームのほぼ全体を覆うようにカメラに見せる。色相ヒストグラムを算出する。このヒストグラムには、対象物の主要な色に対応する強い最大値が含まれている可能性があります。
  • トラッキングの際には、事前に計算したヒストグラムを用いて、入力ビデオフレームの色相平面のバックプロジェクションを計算します。弱い色を抑制するために、バックプロジェクションの閾値を設定します。また、彩度が不十分な画素や、暗すぎる画素、明るすぎる画素を抑制することも有効です。
  • 結果として得られた画像の中から連結された成分を見つけ、例えば最大の成分を選択します。

これは、CamShift カラーオブジェクトトラッカーの近似アルゴリズムです。

引数
images ソースアレイ。これらはすべて,同じ深さ,CV_8U, CV_16U または CV_32F ,そして同じサイズでなければいけません.また,それぞれが任意のチャンネル数を持つことができます.
nimages ソース画像の数.
channels バックプロジェクションの計算に利用されるチャンネルのリスト.チャンネルの数は,ヒストグラムの次元と一致しなければいけません.配列の1番目のチャンネルは,0 から images[0].channels()-1 までの数字で表され,配列の2番目のチャンネルは, images[0].channels() から images[0].channels() + images[1].channels()-1 までの数字で表され,以下同様です.
hist 密なヒストグラム,または疎なヒストグラムを入力とします.
backProject 変換先のバックプロジェクション配列は, images[0] と同じサイズ,同じビット深度のシングルチャンネル配列です.
ranges 各次元のヒストグラムのビンの境界を表す配列の配列.参照calcHist.
scale 出力されるバックプロジェクションのスケールファクタ(オプション).
uniform ヒストグラムが一様であるか否かを示すフラグ(上述).
参照
calcHist,compareHist

calcBackProject() [3/3]

CV_EXPORTS_W void cv::calcBackProject ( InputArrayOfArrays images,
const std::vector< int > & channels,
InputArray hist,
OutputArray dst,
const std::vector< float > & ranges,
double scale
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

calcHist() [1/3]

CV_EXPORTS void cv::calcHist ( const Mat * images,
int nimages,
const int * channels,
InputArray mask,
OutputArray hist,
int dims,
const int * histSize,
const float ** ranges,
bool uniform = true,
bool accumulate = false
)

配列の集合のヒストグラムを計算します.

この関数はcv::calcHistは,1つあるいは複数の配列のヒストグラムを計算します.ヒストグラムのビンを増やすのに使われるタプルの要素は,対応する入力配列の同じ位置から取られます.以下のサンプルでは,カラー画像の2次元色相・彩度ヒストグラムを計算する方法を示しています.

引数
images ソースアレイ。これらはすべて,同じ深さ,CV_8U, CV_16U または CV_32F ,そして同じサイズでなければいけません.また,それぞれが任意のチャンネル数を持つことができます.
nimages ソース画像の数.
channels ヒストグラムを計算するために利用されるDIMチャンネルのリスト.1番目の配列チャンネルは,0 から images[0].channels()-1 までの数字で表され,2番目の配列チャンネルは, images[0].channels() から images[0].channels() + images[1].channels()-1 までの数字で表され,以下同様に数えられます.
mask オプションのマスク.行列が空ではない場合, images[i] と同じサイズの8ビット配列でなければいけません.非0のマスク要素は,ヒストグラムでカウントされる配列要素を示します.
hist 密な,あるいは疎な dims - 次元の配列であるヒストグラムを出力します.
dims ヒストグラムの次元は正であり, CV_MAX_DIMS (現在の OpenCV のバージョンでは 32 に等しい)よりも大きくてはいけません.
histSize 各次元におけるヒストグラムのサイズを表す配列.
ranges 各次元におけるヒストグラムのビンの境界線を表す dims 配列の配列.ヒストグラムが一様( uniform =true )である場合,各次元 i において,0 番目のヒストグラムビンの下側(含む)の境界を指定するだけで十分です.$L_0$0番目のヒストグラムビンの下側(含む)境界線と,最後のヒストグラムビンの上側(排他的)境界線$U_{\texttt{histSize}[i]-1}$最後のヒストグラムビン histSize[i]-1 の上側(排他的)境界を指定すれば十分です.つまり,一様なヒストグラムの場合, ranges[i]はそれぞれ2個の要素を持つ配列となります.ヒストグラムが一様でない場合( uniform=false ), ranges[i] の各要素には histSize[i]+1 の要素が含まれます.$L_0, U_0=L_1, U_1=L_2, ..., U_{\texttt{histSize[i]}-2}=L_{\texttt{histSize[i]}-1}, U_{\texttt{histSize[i]}-1}$. の間に存在しない配列要素は,ヒストグラムには含まれません.$L_0$および$U_{\texttt{histSize[i]}-1}$の間にない配列要素は,ヒストグラムには含まれません.
uniform ヒストグラムが一様であるか否かを示すフラグ(上述).
accumulate 集積フラグ.これがセットされていると,ヒストグラムが割り当てられたときに,最初からクリアされません.この機能により,複数の配列セットから1つのヒストグラムを計算したり,ヒストグラムを随時更新したりすることができます.

calcHist() [2/3]

CV_EXPORTS void cv::calcHist ( const Mat * images,
int nimages,
const int * channels,
InputArray mask,
SparseMat & hist,
int dims,
const int * histSize,
const float ** ranges,
bool uniform = true,
bool accumulate = false
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

このバージョンでは,出力に SparseMat を利用しています.

calcHist() [3/3]

CV_EXPORTS_W void cv::calcHist ( InputArrayOfArrays images,
const std::vector< int > & channels,
InputArray mask,
OutputArray hist,
const std::vector< int > & histSize,
const std::vector< float > & ranges,
bool accumulate = false
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

compareHist() [1/2]

CV_EXPORTS double cv::compareHist ( const SparseMat & H1,
const SparseMat & H2,
int method
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

compareHist() [2/2]

CV_EXPORTS_W double cv::compareHist ( InputArray H1,
InputArray H2,
int method
)

2つのヒストグラムを比較します.

この関数はcv::compareHistこの関数は,指定された手法を用いて 2 つの密なヒストグラム,あるいは 2 つの疎なヒストグラムを比較します.

この関数は$d(H_1, H_2)$.

この関数は,1次元,2次元,3次元の密なヒストグラムではうまく動作しますが,高次元の疎なヒストグラムには適していないかもしれません.このようなヒストグラムでは,エイリアシングやサンプリングの問題のために,非ゼロのヒストグラムビンの座標がわずかにずれることがあります.このようなヒストグラムや,より一般的な重み付けされた点の疎な構成を比較するには,次のような方法が考えられます.EMD関数によってローカルに保存されたすべての記述子をデータセットに挿入して更新する.

引数
H1 最初に比較したヒストグラム。
H2 H1と同じ大きさの第2比較ヒストグラム。
method 比較方法についてはHistCompMethods

createCLAHE()

CV_EXPORTS_W Ptr< CLAHE > cv::createCLAHE ( double clipLimit = 40.0,
Size tileGridSize = Size(8, 8)
)

オブジェクトへのスマート ポインタを作成し、初期化します。cv::CLAHEクラスを作成し,それを初期化します.

引数
clipLimit コントラストを制限するためのしきい値.
tileGridSize ヒストグラムの均等化のためのグリッドのサイズ.tileGridSize は,行と列のタイルの数を定義します.

EMD()

CV_EXPORTS float cv::EMD ( InputArray signature1,
InputArray signature2,
int distType,
InputArray cost = noArray(),
float * lowerBound = 0,
OutputArray flow = noArray()
)

2つの重み付けされた点配置間の「最小作業」距離を計算します.

この関数は,2つの重み付けされた点群の間の地球移動距離および/または距離の下界を計算します.で説明されているアプリケーションの1つです.[RubnerSept98] [Rubner2000,[Rubner2000]は,画像検索のための多次元ヒストグラム比較です.EMDは輸送問題であり,シンプレックスアルゴリズムの修正を用いて解かれるため,最悪の場合,複雑さは指数関数的になるが,平均的にははるかに高速である.実数メトリックの場合、下側の境界は(線形時間アルゴリズムを使用して)さらに高速に計算することができ、2つのシグネチャが同じオブジェクトに関連しないほど離れているかどうかを大まかに判断するのに使用することができます。

引数
signature1 最初の署名は$\texttt{size1}\times \texttt{dims}+1$浮動小数点の行列です。各行には,点の重みと,それに続く点の座標が格納されています.ユーザ定義のコスト行列が使用される場合、行列は1列(重みのみ)であることが許されます。重みは非負で、少なくとも1つの非ゼロの値を持たなければならない。
signature2 第2署名は、行数が異なっていても、署名1と同じ形式である。重みの合計が異なる場合もある。この場合、追加の「ダミー」ポイントがsignature1またはsignature2のいずれかに追加される。重みは非負であり、少なくとも1つの非ゼロの値を持つ必要がある。
distType 使用されるメトリック。参照DistanceTypes.
cost ユーザー定義の$\texttt{size1}\times \texttt{size2}$コストマトリックスを参照してください。また、コスト行列を使用する場合は、メトリック関数が必要なため、lower boundary lowerBoundは計算できません。
lowerBound オプションの入出力パラメータ:質量中心間の距離である2つのシグネチャー間の距離の下部境界。ユーザー定義のコスト行列が使用されている場合、点構成の総重量が等しくない場合、またはシグネチャが重量のみで構成されている場合(シグネチャ行列が1列の場合)は、下側境界が計算されないことがあります。また,*lowerBound を初期化する必要があります。計算された質量中心間の距離が *lowerBound 以上の場合(シグネチャが十分に離れていることを意味します),この関数はEMDを計算しません.どのような場合でも,*lowerBound は,リターン時に計算されたマスセンター間の距離に設定されます。したがって,質量中心間の距離とEMDの両方を計算したい場合は,*lowerBoundを0に設定する必要があります.
flow 結果$\texttt{size1} \times \texttt{size2}$フローのマトリックス。$\texttt{flow}_{i,j}$は、署名1の$i$署名1の-番目のポイントから$j$シグネチャ2の-番目の点へのフローです.

equalizeHist()

CV_EXPORTS_W void cv::equalizeHist ( InputArray src,
OutputArray dst
)

グレースケール画像のヒストグラムを均等化します.

この関数は,以下のアルゴリズムを用いて,入力画像のヒストグラムを均等化します.

  • ヒストグラムの計算$H$src のヒストグラムを計算します.
  • ヒストグラムのビンの合計が 255 になるように,ヒストグラムを正規化します.
  • ヒストグラムの積分値を求めます.

    \[H'_i = \sum _{0 \le j < i} H(j)\]

  • を使って画像を変換します.$H'$をルックアップテーブルとして用いて,画像を変換します.$\texttt{dst}(x,y) = H'(\texttt{src}(x,y))$

このアルゴリズムにより,画像の輝度が正規化され,コントラストが向上します.

引数
src 8ビットのシングルチャンネル画像
dst src と同じサイズ,同じタイプの出力画像.