OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
无匹配
| 枚举 | 函数
历史图

详细描述

class  cv::CLAHE
 对比度限幅自适应直方图均衡化基类。 更多...
 

枚举

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::calcHist (InputArrayOfArrays images, const std::vector< int > &channels, InputArray mask, OutputArray dst, const std::vector< float > &ranges, double scale)
 
void cv::calcHist (InputArrayOfArrays images, const std::vector< int > &channels, InputArray mask, OutputArray dst, const std::vector< int > &histSize, const std::vector< float > &ranges, bool accumulate=false)
 计算一系列数组的历史图。
 
void cv::compareHist (SparseMat &H1, const SparseMat &H2, int method)
 
void cv::compareHist (InputArray H1, InputArray H2, int method)
 
double cv::compareHist (const SparseMat &H1, const SparseMat &H2, int method)
 
double cv::compareHist (InputArray H1, InputArray H2, int method)
 比较两个历史图。
 
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\) 是直方图的直方格总数。

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

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 
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)}\]

此替代公式经常用于纹理比较。例如,参见

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 值,按 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)。
另见
calcHistcompareHist

◆ calcBackProject() [3/3]

void cv::calcBackProject ( InputArrayOfArrays  images,
const std::vector< int > &  channels,
InputArray  hist,
OutputArray  dst,
const std::vector< float > &  ranges,
double  缩放 
)
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计算一个或多个数组的直方图。用于增加直方图桶的元组元素是从对应输入数组的相同位置获取的。下面的示例展示了如何计算彩色图像的二维色调-饱和度直方图。

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(), // 不要使用mask
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( "Source", 1 );
imshow( "Source", src );
namedWindow( "H-S Histogram", 1 );
imshow( "H-S Histogram", histImg );
}
n维稠密数组类
定义 mat.hpp:812
static CV_NODISCARD_STD MatExpr zeros(int rows, int cols, int type)
返回一个指定大小和类型的零数组。
static Scalar_< double > all(double v0)
返回所有元素都设置为v0的标量
void minMaxLoc(InputArray src, double *minVal, double *maxVal=0, Point *minLoc=0, Point *maxLoc=0, InputArray mask=noArray())
在数组中查找全局最小值和最大值。
Point2i Point
定义 types.hpp:209
#define CV_8UC3
定义 interface.h:90
int cvRound(double value)
将浮点数四舍五入到最近的整数。
定义 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)
创建一个窗口。
@ IMREAD_COLOR
如果设置,则始终将图像转换为3通道BGR颜色图像。
定义 imgcodecs.hpp:71
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件中加载图像。
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
将图像从一种颜色空间转换为另一种颜色空间。
@ COLOR_BGR2HSV
将RGB/BGR转换为HSV(色调、饱和度、值),H范围0..180,如果8位图像,颜色转换
定义 imgproc.hpp:598
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)
定义 quality_utils.hpp:90
磁盘文件上的文件存储的“黑盒子”表示。
定义 core.hpp:102
参数
images源数组。它们都应该有相同的深度,CV_8U,CV_16U 或 CV_32F,并且具有相同的大小。每个数组都可以有任意数量的通道。
nimages源图像的数量。
channels用于计算直方图的维度通道列表。第一个数组的通道从0编号到images[0].channels() - 1,第二个数组的通道从images[0].channels()到images[0].channels() + images[1].channels() - 1,依此类推。
mask可选掩码。如果矩阵不为空,它必须是一个与images[i]同样大小的8位数组。非零掩码元素标记的数组元素包含在直方图中。
hist输出直方图,它是一个dense或sparse的dims维数组。
dims直方图维数必须为正且不超过CV_MAX_DIMS(在当前OpenCV版本中等于32)。
histSize每个维度的直方图大小数组。
ranges包含每个维度的直方图bin边界的dims数组。当直方图为均匀直方图(uniform =true)时,对于每个维度i,只需指定第0个直方图的边界(包括)\(L_0\)和最后一个直方图bin的边界(不包括)\(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累积标志。如果设置,则分配时不清理直方图。此功能可让您从多个数组集合中计算单个直方图,或在时间中更新直方图。

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

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

比较两个历史图。

函数cv::compareHist使用指定方法比较两个密集或两个稀疏直方图。

函数返回\(d(H_1, H_2)\) 。

尽管该函数与1维、2维、3维密集直方图配合良好,但对于高维稀疏直方图可能不适合。在这样的直方图中,由于混叠和采样问题,非零直方图bin的坐标可能会略微偏移。比较此类直方图或更一般的加权点稀疏配置,请考虑使用EMD函数。

参数
H1第一个直方图。
H2与H1大小相同的第二个直方图。
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()

浮点 cv::EMD ( InputArray  签名1,
InputArray  签名2,
int  距离类型,
InputArray  成本 = noArray()
浮点指针 下限 = 0;
OutputArray  流量 = noArray()
)

#include <opencv2/imgproc.hpp>

计算两个加权点配置之间的“最小工作量”距离。

该函数计算两个加权点配置之间的地球迁移距离及/或距离的下限。在本节中描述的应用之一是图像检索中的多维直方图比较。EMD 是一个使用某些简化的单纯形算法解决的运输问题,因此在最坏情况下其复杂度呈指数增长,但在平均情况下要快得多。在实际度量情况下,下限可以更快地计算(使用线性时间算法),并且可以用来大致判断两个签名是否足够远,以至于它们无法关联到同一对象。

参数
签名1第一个签名,一个 \(\texttt{size1}\times \texttt{dims}+1\) 浮点矩阵。每行存储点权重,然后是点坐标。如果使用用户定义的成本矩阵,则矩阵可以只有一个列(只有权重)。权重必须为非负值,且至少有一个不为零的值。
签名2与签名1格式相同的第二个签名,尽管行数可能不同。总权重可能不同。在这种情况下,将为签名1或签名2添加一个额外的“虚拟”点。权重必须为非负值,且至少有一个不为零的值。
距离类型使用的度量。参见 DistanceTypes
成本用户定义的 \(\texttt{size1}\times \texttt{size2}\) 成本矩阵。此外,如果使用成本矩阵,则不能计算下限,因为它需要一个度量函数。
下限可选输入/输出参数:两个签名之间的距离下限,即质心之间的距离。如果使用用户定义的成本矩阵,点配置的总权重不相等,或者签名仅由权重组成(签名矩阵只有一列),则不能计算下限。您必须**初始化**lowerBound。如果计算出的质心距离大于或等于*lowerBound(这意味着签名足够远),则函数不计算EMD。在任何情况下,*lowerBound 都将设置为返回时计算出的质心距离。因此,如果您想同时计算质心距离和EMD,则*lowerBound应设置为0。
流量结果 \(\texttt{size1} \times \texttt{size2}\) 流量矩阵:\(\texttt{flow}_{i,j}\) 是从签名1的第i个点到签名2的第j个点的流量。

◆ equalizeHist()

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

#include <opencv2/imgproc.hpp>

均衡灰度图像的直方图。

该函数使用以下算法对输入图像的直方图进行均衡:

  • 计算src的直方图H。
  • 将直方图归一化,使得直方图分箱的总和值为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  签名1,
InputArray  签名2,
int  距离类型,
InputArray  成本 = noArray()
Ptr< float >  下限 = Ptr< float >(),
OutputArray  流量 = noArray()
)
Python
cv.EMD(signature1, signature2, distType[, cost[, lowerBound[, flow]]]) -> retval, lowerBound, flow

#include <opencv2/imgproc.hpp>