opencv 直方图 直方图均衡化 反向投影

opencv 直方图 直方图均衡化 反向投影

直方图
就是对数据进行统计,将统计值组织到一系列事先定义好的 bin( 直方图中的柱子 ) 中。
bin 中的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征
直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数.
(直方图是图像中各像素灰度出现频次的统计量,反映图像中不同灰度值出现的次数)

//C
typedef struct CvHistogram
{
    int     type;
    CvArr*  bins;
    float   thresh[CV_MAX_DIM][2];  /* For uniform histograms.                      */
    float** thresh2;                /* For non-uniform histograms.                  */
    CvMatND mat;                    /* Embedded matrix header for array histograms. */
}
CvHistogram;
/* Calculates array histogram */
CVAPI(void)  cvCalcArrHist( CvArr** arr, CvHistogram* hist,
                            int accumulate CV_DEFAULT(0),
                            const CvArr* mask CV_DEFAULT(NULL) );
CV_INLINE  void  cvCalcHist( IplImage** image, CvHistogram* hist,
                             int accumulate CV_DEFAULT(0),
                             const CvArr* mask CV_DEFAULT(NULL) )
{
    cvCalcArrHist( (CvArr**)image, hist, accumulate, mask );
}

//C++
//! computes the joint dense histogram for a set of images.
CV_EXPORTS 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 );

//! computes the joint sparse histogram for a set of images.
CV_EXPORTS void 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 calcHist( InputArrayOfArrays images,
                            const vector<int>& channels,
                            InputArray mask, OutputArray hist,
                            const vector<int>& histSize,
                            const vector<float>& ranges,
                            bool accumulate=false );

images:
为输入图像,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F)
nimages:
要计算直方图的图像个数。可为多图像求直方图
channels:
图像的通道,它是一个数组,灰度图像channels[1]={0};彩色图像则channels[3]={0,1,2};只求彩色图像第2个通道的直方图,则channels[1]={1};
mask:
是一个遮罩图像用于确定哪些点参与计算,默认设置为一个空图像,即:Mat()。
hist:
计算得到的直方图
dims:
得到的直方图的维数,灰度图像为1维,彩色图像为3维
histSize:
直方图横坐标的区间数。如果是10,则它会把横坐标分为10份,然后统计每个区间的像素点总和。
ranges:
一个二维数组,指出每个区间的范围。
uniform:
表明直方图是否等距
accumulate:
多图像下直方图的显示与存储有关。

直方图均衡化:
把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同
(即通过拉伸像素强度分布范围来增强图像对比度的一种方法,equalizeHist()方法能归一化图像亮度和增强对比度,使像素在整个强度范围内均衡分布,是灰度变换的一个重要应用)

//! normalizes the grayscale image brightness and contrast by normalizing its histogram
CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );

功能:
直方图均衡化,归一化图像亮度和增强对比度
src:
源图像,须为灰度图
dst:
目标图像,须与源图像保持一样的大小、类型

反向投影
是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式, 反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目(首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征)

直方图统计图像中像素分布的概率,反向投影是通过直方图来形成图像(跟直方图正好相反),其步骤有点类似于直方图均衡化(是将图像中的每个像素值由一个地方迁移到另外一个地方)
反向投影是直接去直方图中取值:
如某种像素值在直方图中的值越大,在进行反向投影操作时其对应的像素值越大即越亮,
如果某灰度值所占面积越小,其反向投影后像素值就会更小,

//! computes back projection for the set of images
CV_EXPORTS void calcBackProject( const Mat* images, int nimages,
                                 const int* channels, InputArray hist,
                                 OutputArray backProject, const float** ranges,
                                 double scale=1, bool uniform=true );

//! computes back projection for the set of images
CV_EXPORTS void 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 calcBackProject( InputArrayOfArrays images, const vector<int>& channels,
                                   InputArray hist, OutputArray dst,
                                   const vector<float>& ranges,
                                   double scale );

参数解释:
images:
输入图像,图像深度必须位CV_8U,CV_16U或CV_32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数
nimages:
输入图像的数量
channels:
用于计算反向投影的通道列表,通道数必须与直方图维度相匹配,
第一个数组的通道是从0到image[0].channels()-1,第二个数组通道从图像image[0].channels()到image[0].channels()+image[1].channels()-1计数
hist:
输入的直方图,直方图的bin可以是密集(dense)或稀疏(sparse)
backProject:
反向投影输出图像,是一个单通道图像,与原图像有相同的尺寸和深度
ranges:
直方图中每个维度bin的取值范围
scale:
可选输出反向投影的比例因子
uniform:
直方图是否均匀分布(uniform)的标识符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值