OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ヒストグラム

詳細説明

クラス

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
}
 

関数

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)
 
void cv::calcBackProject (const Mat *images, int nimages, const int *channels, InputArray hist, OutputArray backProject, const float **ranges, double scale=1, bool uniform=true)
 ヒストグラムのバックプロジェクションを計算する。
 
void cv::calcBackProject (InputArrayOfArrays images, const std::vector< int > &channels, InputArray hist, OutputArray dst, const std::vector< float > &ranges, double scale)
 
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)
 配列の集合のヒストグラムを計算する。
 
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)
 
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)
 
double cv::compareHist (const SparseMat &H1, const SparseMat &H2, int method)
 
double cv::compareHist (InputArray H1, InputArray H2, int method)
 2つのヒストグラムを比較する。
 
Ptr< CLAHEcv::createCLAHE (double clipLimit=40.0, Size tileGridSize=Size(8, 8))
 cv::CLAHE クラスへのスマートポインタを生成して初期化する。
 
float cv::EMD (InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), float *lowerBound=0, OutputArray flow=noArray())
 重み付けされた2つの点配置の間の「最小仕事量」距離を計算する。
 
void cv::equalizeHist (InputArray src, OutputArray dst)
 グレースケール画像のヒストグラムを平坦化する。
 
float cv::wrapperEMD (InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), Ptr< float > lowerBound=Ptr< float >(), OutputArray flow=noArray())
 

列挙型詳解

◆ HistCompMethods

#include <opencv2/imgproc.hpp>

ヒストグラム比較方法

列挙値
HISTCMP_CORREL 
Python: cv.HISTCMP_CORREL

相関 (Correlation)

\[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 
Python: cv.HISTCMP_CHISQR

カイ二乗 (Chi-Square)

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

HISTCMP_INTERSECT 
Python: cv.HISTCMP_INTERSECT

交差 (Intersection)

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

HISTCMP_BHATTACHARYYA 
Python: cv.HISTCMP_BHATTACHARYYA

バタチャリヤ距離 (Bhattacharyya distance) (実際にはOpenCVは、バタチャリヤ係数に関連するヘリンガー距離を計算する。)

\[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 
Python: cv.HISTCMP_HELLINGER

HISTCMP_BHATTACHARYYA の同義語。

HISTCMP_CHISQR_ALT 
Python: cv.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)}\]

この代替式はテクスチャ比較で一般的に使われる。たとえば [228] を参照。

HISTCMP_KL_DIV 
Python: cv.HISTCMP_KL_DIV

カルバック・ライブラー情報量 (Kullback-Leibler divergence)

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

関数詳解

◆ calcBackProject() [1/3]

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 )
Python:
cv.calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

#include <opencv2/imgproc.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ calcBackProject() [2/3]

void cv::calcBackProject ( const Mat * images,
int nimages,
const int * channels,
InputArray hist,
OutputArray backProject,
const float ** ranges,
double scale = 1,
bool uniform = true )
Python:
cv.calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

#include <opencv2/imgproc.hpp>

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

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 を参照)。
参照
calcHist, compareHist

◆ calcBackProject() [3/3]

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

#include <opencv2/imgproc.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ calcHist() [1/3]

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 )
Python:
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

#include <opencv2/imgproc.hpp>

配列の集合のヒストグラムを計算する。

関数 cv::calcHist は、1つ以上の配列のヒストグラムを計算する。ヒストグラムのビンをインクリメントするために用いるタプルの要素は、対応する各入力配列の同じ位置から取得される。以下のサンプルは、カラー画像に対する2次元の色相-彩度ヒストグラムを計算する方法を示している。 :

using namespace cv;
int main( int argc, char** argv )
{
Mat src, hsv;
if( argc != 2 || !(src=imread(argv[1], IMREAD_COLOR)).data )
return -1;
cvtColor(src, hsv, COLOR_BGR2HSV);
// Quantize the hue to 30 levels
// and the saturation to 32 levels
int hbins = 30, sbins = 32;
int histSize[] = {hbins, sbins};
// hue varies from 0 to 179, see cvtColor
float hranges[] = { 0, 180 };
// saturation varies from 0 (black-gray-white) to
// 255 (pure spectrum color)
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
// we compute the histogram from the 0-th and 1-st channels
int channels[] = {0, 1};
calcHist( &hsv, 1, channels, Mat(), // do not use mask
hist, 2, histSize, ranges,
true, // the histogram is uniform
false );
double maxVal=0;
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 10;
Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
for( int h = 0; h < hbins; h++ )
for( int s = 0; s < sbins; s++ )
{
float binVal = hist.at<float>(h, s);
int intensity = cvRound(binVal*255/maxVal);
rectangle( histImg, Point(h*scale, s*scale),
Point( (h+1)*scale - 1, (s+1)*scale - 1),
Scalar::all(intensity),
-1 );
}
namedWindow( "Source", 1 );
imshow( "Source", src );
namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histImg );
}
Comma-separated Matrix Initializer.
Definition mat.hpp:964
void minMaxLoc(InputArray src, double *minVal, double *maxVal=0, Point *minLoc=0, Point *maxLoc=0, InputArray mask=noArray())
Finds the global minimum and maximum in an array.
#define CV_8UC3
Definition interface.h:79
int cvRound(double value)
Rounds floating-point number to the nearest integer.
Definition fast_math.hpp:200
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
Creates a window.
Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
Loads an image from a file.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
Converts an image from one color space to another.
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a simple, thick, or filled up-right rectangle.
void 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)
Calculates a histogram of a set of arrays.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
void scale(cv::Mat &mat, const cv::Mat &range, const T min, const T max)
Definition quality_utils.hpp:90
Definition core.hpp:107
引数
images入力配列。すべて同じビット深度 (CV_8U, CV_16U または CV_32F) と同じサイズでなければならない。各配列は任意の数のチャンネルを持つことができる。
nimages入力画像の枚数。
channelsヒストグラムの計算に使用する dims 個のチャンネルのリスト。1つ目の配列のチャンネルは 0 から images[0].channels()-1 まで番号付けされ、2つ目の配列のチャンネルは images[0].channels() から images[0].channels() + images[1].channels()-1 まで数えられ、以降同様である。
mask省略可能なマスク。行列が空でない場合、images[i] と同じサイズの8ビット配列でなければならない。非ゼロのマスク要素は、ヒストグラムにカウントされる配列要素を示す。
hist出力ヒストグラム。密または疎の dims 次元配列である。
dimsヒストグラムの次元数。正の値で、CV_MAX_DIMS (現在のOpenCVバージョンでは32に等しい) 以下でなければならない。
histSize各次元におけるヒストグラムサイズの配列。
ranges各次元におけるヒストグラムビン境界の dims 個の配列の配列。ヒストグラムが一様 (uniform =true) の場合、各次元 i について、0番目のヒストグラムビンの下限 (含む) 境界 \(L_0\) と、最後のヒストグラムビン histSize[i]-1 の上限 (含まない) 境界 \(U_{\texttt{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累積フラグ。これが設定されている場合、ヒストグラムは確保時の最初にクリアされない。この機能により、複数の配列の集合から単一のヒストグラムを計算したり、時系列でヒストグラムを更新したりできる。

◆ calcHist() [2/3]

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 )
Python:
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

#include <opencv2/imgproc.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

このバリアントは出力にSparseMatを使用する。

◆ calcHist() [3/3]

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 )
Python:
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

#include <opencv2/imgproc.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

このバリアントは一様(uniform)ヒストグラムのみをサポートする。

ranges引数は、空のベクトルか、histSize.size()*2 要素(histSize.size() 個の要素ペア)からなる平坦化されたベクトルのいずれかである。各ペアの第1要素と第2要素は、それぞれ下限と上限を指定する。

◆ compareHist() [1/2]

double cv::compareHist ( const SparseMat & H1,
const SparseMat & H2,
int method )
Python:
cv.compareHist(H1, H2, method) -> retval

#include <opencv2/imgproc.hpp>

これは利便性のために提供されているオーバーロードされたメンバ関数である。上記の関数とは、受け取る引数のみが異なる。

◆ compareHist() [2/2]

double cv::compareHist ( InputArray H1,
InputArray H2,
int method )
Python:
cv.compareHist(H1, H2, method) -> retval

#include <opencv2/imgproc.hpp>

2つのヒストグラムを比較する。

関数 cv::compareHist は、指定したメソッドを用いて2つの密(dense)ヒストグラムまたは2つの疎(sparse)ヒストグラムを比較する。

この関数は \(d(H_1, H_2)\) を返す。

この関数は1次元・2次元・3次元の密ヒストグラムに対してはうまく機能するが、高次元の疎ヒストグラムには適さない場合がある。そのようなヒストグラムでは、エイリアシングやサンプリングの問題により、非ゼロのヒストグラムビンの座標がわずかにずれることがある。このようなヒストグラム、あるいはより一般的な重み付き点の疎な構成を比較するには、EMD 関数の使用を検討するとよい。

引数
H1比較する1つ目のヒストグラム。
H2H1 と同じサイズの、比較する2つ目のヒストグラム。
method比較方法。HistCompMethods を参照。

◆ createCLAHE()

Ptr< CLAHE > cv::createCLAHE ( double clipLimit = 40.0,
Size tileGridSize = Size(8, 8) )
Python:
cv.createCLAHE([, clipLimit[, tileGridSize]]) -> retval

#include <opencv2/imgproc.hpp>

cv::CLAHE クラスへのスマートポインタを作成し、初期化する。

引数
clipLimitコントラスト制限のためのしきい値。
tileGridSizeヒストグラム平坦化のためのグリッドのサイズ。入力画像は等しいサイズの矩形タイルに分割される。tileGridSize は行方向と列方向のタイル数を定義する。

◆ EMD()

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

#include <opencv2/imgproc.hpp>

2つの重み付き点構成の間の「最小仕事(minimal work)」距離を計算する。

この関数は、2 つの重み付き点配置間のearth mover距離、および/またはその距離の下限を計算する。[238][239] で説明されている応用の一つは、画像検索のための多次元ヒストグラム比較である。EMD は輸送問題であり、シンプレックス法を一部変更した手法で解かれるため、最悪ケースでは計算量は指数的だが、平均的にははるかに高速である。実距離(real metric)の場合、下限はさらに高速に(線形時間アルゴリズムで)計算でき、2 つのシグネチャが十分に離れていて同じ対象に関連しえないかどうかをおおまかに判定するために利用できる。

引数
signature11つ目のシグネチャ。\(\texttt{size1}\times \texttt{dims}+1\) の浮動小数点行列である。各行には、点の重みに続いて点の座標が格納される。ユーザー定義のコスト行列を使用する場合、行列は単一列 (重みのみ) を持つことが許される。重みは非負で、少なくとも1つの非ゼロ値を持たなければならない。
signature2signature1 と同じ形式の2つ目のシグネチャ。ただし行数は異なってもよい。総重みも異なってもよい。この場合、signature1 または signature2 のいずれかに余分な「ダミー」点が追加される。重みは非負で、少なくとも1つの非ゼロ値を持たなければならない。
distType使用するメトリック。DistanceTypes を参照。
costユーザー定義の \(\texttt{size1}\times \texttt{size2}\) コスト行列。また、コスト行列を使用する場合、下限 lowerBound は距離尺度関数を必要とするため計算できない。
lowerBound省略可能な入出力引数: 2つのシグネチャ間の距離の下限。これは質量中心間の距離である。下限は、ユーザー定義のコスト行列を使用する場合、点配置の総重みが等しくない場合、またはシグネチャが重みのみで構成される場合 (シグネチャ行列が単一列を持つ場合) には計算されないことがある。*lowerBound は初期化しなければならない。計算された質量中心間の距離が *lowerBound 以上の場合 (シグネチャが十分に離れていることを意味する)、関数はEMDを計算しない。いずれの場合も、戻り時に *lowerBound は計算された質量中心間の距離に設定される。したがって、質量中心間の距離とEMDの両方を計算したい場合は、*lowerBound を 0 に設定すべきである。
flow結果として得られる \(\texttt{size1} \times \texttt{size2}\) のフロー行列。\(\texttt{flow}_{i,j}\) は signature1 の \(i\) 番目の点から signature2 の \(j\) 番目の点へのフローである。

◆ equalizeHist()

void cv::equalizeHist ( InputArray src,
OutputArray dst )
Python:
cv.equalizeHist(src[, dst]) -> dst

#include <opencv2/imgproc.hpp>

グレースケール画像のヒストグラムを平坦化(equalize)する。

この関数は次のアルゴリズムを用いて入力画像のヒストグラムを均一化する:

  • src に対するヒストグラム \(H\) を計算する。
  • ヒストグラムのビンの総和が255になるようにヒストグラムを正規化する。
  • Compute the integral of the histogram:

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

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

このアルゴリズムは画像の明るさを正規化し、コントラストを高める。

引数
src8ビットのシングルチャンネル元画像。
dstsrc と同じサイズ・型の出力画像。

◆ wrapperEMD()

float cv::wrapperEMD ( InputArray signature1,
InputArray signature2,
int distType,
InputArray cost = noArray(),
Ptr< float > lowerBound = Ptr< float >(),
OutputArray flow = noArray() )
Python:
cv.EMD(signature1, signature2, distType[, cost[, lowerBound[, flow]]]) -> retval, lowerBound, flow

#include <opencv2/imgproc.hpp>