OpenCV 4.12.0
開源計算機視覺
載入中...
搜尋中...
無匹配項
直方圖

詳細描述

類  cv::CLAHE
 對比度受限自適應直方圖均衡化的基類。更多...
 

列舉

列舉  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)
 Compares two histograms.
 
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())
 計算兩個加權點配置之間的“最小工作量”距離。
 
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

相關性

\[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\) 是直方圖 bin 的總數。

HISTCMP_CHISQR 
Python: cv.HISTCMP_CHISQR

卡方

\[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

交叉

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

HISTCMP_BHATTACHARYYA 
Python: cv.HISTCMP_BHATTACHARYYA

巴塔查裡雅距離(實際上,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)}\]

這個替代公式經常用於紋理比較。例如,參見 [224]

HISTCMP_KL_DIV 
Python: cv.HISTCMP_KL_DIV

庫爾巴克-萊布勒散度

\[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),該函式從輸入影像中選定的通道收集值並找到對應的直方圖 bin。但它不是增加 bin 的值,而是讀取 bin 值,透過 `scale` 進行縮放,並存儲在 `backProject(x,y)` 中。從統計學角度來看,該函式根據直方圖表示的經驗機率分佈計算每個元素值的機率。例如,您可以瞭解如何在一個場景中查詢和跟蹤一個顏色鮮豔的物體。

  • 在跟蹤之前,將物體展示給相機,使其幾乎覆蓋整個幀。計算色調直方圖。該直方圖可能具有強烈的最大值,對應於物體中的主導顏色。
  • 跟蹤時,使用預計算的直方圖計算每個輸入影片幀的色調平面的反向投影。對反向投影進行閾值處理以抑制弱顏色。抑制顏色飽和度不足以及過暗或過亮的畫素也可能是有意義的。
  • 在結果影像中找到連通分量,並選擇,例如,最大的分量。

這是 CamShift 顏色物體跟蹤器的一種近似演算法。

引數
images源陣列。它們都應該具有相同的深度(CV_8U、CV_16U 或 CV_32F)和相同的大小。每個陣列可以有任意數量的通道。
nimages源影像的數量。
channels用於計算反向投影的通道列表。通道數必須與直方圖的維度匹配。第一個陣列的通道從 0 到 `images[0].channels()-1` 編號,第二個陣列的通道從 `images[0].channels()` 到 `images[0].channels() + images[1].channels()-1` 計數,依此類推。
hist輸入直方圖,可以是稠密的或稀疏的。
backProject目標反向投影陣列,它是與 `images[0]` 具有相同大小和深度的單通道陣列。
ranges每個維度中直方圖 bin 邊界的陣列的陣列。參見 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 #include <opencv2/surface_matching/ppf_helpers.hpp>
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 計算一個或多個數組的直方圖。用於增加直方圖 bin 的元組元素取自相應輸入陣列的相同位置。下面的示例展示瞭如何計算彩色影像的 2D 色調-飽和度直方圖。

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);
// 將色調量化為 30 級
// 將飽和度量化為 32 級
int hbins = 30, sbins = 32;
int histSize[] = {hbins, sbins};
// 色調範圍從 0 到 179,參見 cvtColor
float hranges[] = { 0, 180 };
// 飽和度範圍從 0(黑-灰-白)到
// 255(純光譜色)
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
// 我們從第 0 和第 1 個通道計算直方圖
int channels[] = {0, 1};
calcHist( &hsv, 1, channels, Mat(), // 不使用掩碼
hist, 2, histSize, ranges,
true, // 直方圖是均勻的
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( "源影像", 1 );
imshow( "源影像", src );
namedWindow( "H-S 直方圖", 1 );
imshow( "H-S 直方圖", histImg );
}
n 維密集陣列類
定義 mat.hpp:830
void minMaxLoc(InputArray src, double *minVal, double *maxVal=0, Point *minLoc=0, Point *maxLoc=0, InputArray mask=noArray())
查詢陣列中的全域性最小值和最大值。
CV_8UC3
#define CV_8UC3
int cvRound(double value)
將浮點數舍入為最接近的整數。
Definition fast_math.hpp:200
void imshow(const String &winname, InputArray mat)
在指定視窗中顯示影像。
int waitKey(int delay=0)
等待按鍵按下。
void namedWindow(const String &winname, int flags=WINDOW_AUTOSIZE)
建立視窗。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
從檔案載入影像。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
將影像從一個顏色空間轉換為另一個顏色空間。
void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
繪製一個簡單、粗或填充的矩形。
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)
計算一組陣列的直方圖。
int main(int argc, char *argv[])
定義 highgui_qt.cpp:3
void scale(cv::Mat &mat, const cv::Mat &range, const T min, const T max)
Definition quality_utils.hpp:90
定義 core.hpp:107
引數
images源陣列。它們都應該具有相同的深度(CV_8U、CV_16U 或 CV_32F)和相同的大小。每個陣列可以有任意數量的通道。
nimages源影像的數量。
channels用於計算直方圖的 dims 通道列表。第一個陣列的通道從 0 到 `images[0].channels()-1` 編號,第二個陣列的通道從 `images[0].channels()` 到 `images[0].channels() + images[1].channels()-1` 計數,依此類推。
mask可選掩碼。如果矩陣不為空,它必須是一個 8 位陣列,其大小與 `images[i]` 相同。非零掩碼元素標記在直方圖中計數的陣列元素。
hist輸出直方圖,它是一個稠密或稀疏的 dims 維陣列。
dims直方圖維度,必須為正且不大於 CV_MAX_DIMS(當前 OpenCV 版本中等於 32)。
histSize每個維度中直方圖大小的陣列。
ranges每個維度中直方圖 bin 邊界的 dims 陣列的陣列。當直方圖是均勻的(`uniform = true`)時,對於每個維度 i,只需指定第 0 個直方圖 bin 的下限(包含)\(L_0\) 和最後一個直方圖 bin `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>

這是一個過載成員函式,為方便起見而提供。它與上述函式的區別僅在於接受的引數。

此變體僅支援均勻直方圖。

`ranges` 引數可以是空向量,也可以是 `histSize.size()*2` 個元素(`histSize.size()` 對元素)的扁平向量。每對的第一個和第二個元素指定下限和上限。

◆ 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>

Compares two histograms.

函式 cv::compareHist 使用指定的方法比較兩個稠密或兩個稀疏直方圖。

該函式返回 \(d(H_1, H_2)\)。

儘管該函式在 1、2、3 維稠密直方圖上表現良好,但它可能不適用於高維稀疏直方圖。在此類直方圖中,由於混疊和取樣問題,非零直方圖 bin 的座標可能會略微偏移。為了比較此類直方圖或更一般的加權點稀疏配置,請考慮使用 EMD 函式。

引數
H1第一個比較的直方圖。
H2第二個比較的直方圖,其大小與 H1 相同。
方法比較方法,參見 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>

計算兩個加權點配置之間的“最小工作量”距離。

該函式計算兩個加權點配置之間的地球移動距離和/或距離的下限。在 [233][234] 中描述的應用之一是用於影像檢索的多維直方圖比較。EMD 是一個運輸問題,透過單純形演算法的一些修改來解決,因此在最壞情況下複雜度是指數級的,但平均而言速度要快得多。在真實度量的情況下,下限可以更快地計算(使用線性時間演算法),並且可以用來粗略地判斷兩個特徵是否足夠遠,以至於它們不能與同一個物件相關。

引數
signature1第一個特徵,一個 \(\texttt{size1}\times \texttt{dims}+1\) 的浮點矩陣。每行儲存點權重,後跟點座標。如果使用使用者定義的成本矩陣,則該矩陣可以只有一列(僅權重)。權重必須是非負數並且至少有一個非零值。
signature2第二個特徵,格式與 `signature1` 相同,但行數可能不同。總權重可能不同。在這種情況下,會向 `signature1` 或 `signature2` 新增一個額外的“虛擬”點。權重必須是非負數並且至少有一個非零值。
distType使用的度量。參見 DistanceTypes
cost使用者定義的 \(\texttt{size1}\times \texttt{size2}\) 成本矩陣。此外,如果使用成本矩陣,則無法計算下限 `lowerBound`,因為它需要度量函式。
lowerBound可選輸入/輸出引數:兩個特徵之間距離的下限,它是質心之間的距離。如果使用使用者定義的成本矩陣、點配置的總權重不相等,或者如果特徵僅由權重組成(特徵矩陣只有一列),則可能無法計算下限。您必須**初始化 `*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>

均衡化灰度影像的直方圖。

該函式使用以下演算法均衡輸入影像的直方圖:

  • 計算src的直方圖\(H\)。
  • 歸一化直方圖,使直方圖 bin 的總和為 255。
  • 計算直方圖的積分

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

  • 使用 \(H'\) 作為查詢錶轉換影像:\(\texttt{dst}(x,y) = H'(\texttt{src}(x,y))\)

該演算法可使影像亮度歸一化並增加對比度。

引數
src源8位單通道影像。
dst與 src 具有相同大小和型別的目標影像。

◆ 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>