Histogram
此函数计算源图像每个通道的强度直方图,并将结果存储在hist数组中。实际操作为划分几个区间,指定图像统计的区域,计算区域内在各区间中的像素值的数量:
- levels是级别数组,长度为levelsLen,一个区间由levels相邻两个值组成,左闭右开;hist数组对区间内数进行统计,因此hist数组长度为levelsLen – 1。
 - hist[k]是源图像像素src(x, y)的数量,该像素满足条件levels[k]<=src(x,y)<levels[k+1]。
 
函数接口声明如下:
- 初始化函数:
HmppResult HMPPI_HistogramInit(HmppDataType dataType, const float *levels[], int32_t levelsLen[], int32_t numChannels,HmppiHistogramPolicy **policy);
HmppResult HMPPI_HistogramUniformInit(HmppDataType dataType, float lowerLevel[], float upperLevel[],int32_t levelsLen[], int32_t numChannels, HmppiHistogramPolicy **policy);
 
- 单通道主函数:
HmppResult HMPPI_Histogram_8u_C1R(const uint8_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist, const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16u_C1R(const uint16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist, const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16s_C1R(const int16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist, const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_32f_C1R(const float *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist, const HmppiHistogramPolicy *policy);
 - 多通道主函数:
HmppResult HMPPI_Histogram_8u_C3R(const uint8_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[3], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16u_C3R(const uint16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[3], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16s_C3R(const int16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[3], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_32f_C3R(const float *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[3], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_8u_C4R(const uint8_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[4], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16u_C4R(const uint16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[4], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_16s_C4R(const int16_t *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[4], const HmppiHistogramPolicy *policy);
HmppResult HMPPI_Histogram_32f_C4R(const float *src, int32_t srcStep, HmppiSize roiSize, uint32_t *hist[4], const HmppiHistogramPolicy *policy);
 - 初始化函数:
HmppResult HMPPI_HistogramInit(HmppDataType dataType, const float *levels[], int32_t levelsLen[], int32_t numChannels,HmppiHistogramPolicy **policy);
HmppResult HMPPI_HistogramUniformInit(HmppDataType dataType, float lowerLevel[], float upperLevel[],int32_t levelsLen[], int32_t numChannels, HmppiHistogramPolicy **policy);
 - 获取区间边界函数:
HmppResult HMPPI_HistogramGetLevels(const HmppiHistogramPolicy *policy, float *levels[]);
 
- 释放函数:
HmppResult HMPPI_HistogramRelease(HmppiHistogramPolicy *policy);
 
参数
参数名  | 
描述  | 
取值范围  | 
输入/输出  | 
|---|---|---|---|
src  | 
指向源图像ROI的指针。  | 
非空  | 
输入  | 
srcStep  | 
源图像中连续行的起点之间的距离,以字节为单位。  | 
(0,INT_MAX]  | 
输入  | 
roiSize  | 
源图像ROI的大小,单位为像素。  | 
roiSize.width∈(0, INT_MAX],roiSize.height∈(0, INT_MAX]  | 
输入  | 
hist  | 
指向计算直方图的指针。在多通道数据的情况下,hist是指向每个通道直方图的指针数组。  | 
非空  | 
输出  | 
datatype  | 
源图像的数据类型。  | 
HMPP8U、HMPP16U HMPP16S、HMPP32F  | 
输入  | 
Levels  | 
指向级别数组的指针。  | 
非空  | 
输入  | 
lowerLevel  | 
Uniform类型直方图的级别下边界,每个通道分开。  | 
非空  | 
输入  | 
upperLevel  | 
Uniform类型直方图的级别上边界,每个通道分开。  | 
非空  | 
输入  | 
numChannels  | 
通道数。  | 
1、3、4  | 
输入  | 
levelsLen  | 
级别数组的长度。每个通道都有单独的级别数量。  | 
各通道级别数组总长度不超过50,000,000。 一般情况下,整型类接口级别数组长度不会超过该类型最小最大值之间整数的数量,浮点类接口级别数组长度也远不会达到50000000这个级别的数量。  | 
输入  | 
uniform  | 
水平分布类型:0-随机步长,1-均匀步长。  | 
0、1  | 
输入  | 
policy(init函数中)  | 
指向HistogramPolicy结构体的双重指针。  | 
非空  | 
输出  | 
policy(主函数中和release函数中)  | 
指向Histogram结构体的指针。  | 
非空  | 
输入  | 
返回值
- 成功:返回HMPP_STS_NO_ERR。
 - 失败:返回错误码。
 
错误码
错误码  | 
描述  | 
|---|---|
HMPP_STS_NULL_PTR_ERR  | 
当任何指定的指针为空时指示错误。  | 
HMPP_STS_DATETYPE_ERR  | 
传入的数据类型不是HMPP8U、HMPP16U、HMPP16S、HMPP32F中的一种。  | 
HMPP_STS_HISTOLEVELS_ERR  | 
级别数组长度小于2。  | 
HMPP_STS_NUMCHANNELS_ERR  | 
通道数不是1、3、4其中一个。  | 
HMPP_STS_MALLOC_FAILED  | 
函数中进行内存申请失败。  | 
HMPP_STS_OVERFLOW  | 
各通道的总级别数组长度超过500000000。  | 
HMPPS_STS_POLICY_STATE_ERR  | 
policy结构体标记值错误。  | 
HMPP_STS_STEP_ERR  | 
srcStep小于或等于0。  | 
HMPP_STS_ROI_ERR  | 
roiSize.width*sizeof(datatype)*numChannels > srcStep。  | 
HMPP_STS_SIZE_ERR  | 
roiSize.width或roiSize.height小于或等于0。  | 
HMPP_STS_RANGE_ERR  | 
Init模式levels数组不是非递减序列,或Uniform模式lowerLevel大于upperLevel。  | 
示例
void HistogramExample()
{
    const int32_t numChannels = 3;
    HmppiSize roiSize = {2,3};
    uint8_t src[28] = { 1, 2, 3, 4, 5, 6, 7, 
                        102, 103, 104, 105, 106, 107, 108,
                        203, 204, 205, 255, 255, 255, 209,
                        4, 5, 6, 7, 8, 9, 10 };
    int32_t srcStep = 7 * sizeof(uint8_t);
    int32_t levelsLen[3] = {3, 4, 5};
    float p0[3] = {0, 105, 256};
    float p1[4] = {0, 100, 200, 256};
    float p2[5] = {0, 60, 105, 205, 256};
    const float *levels[3] = {p0, p1, p2};
    uint32_t h0[2], h1[3], h2[4];
    uint32_t *hist[3] = {h0, h1, h2};
    HmppiHistogramPolicy *policy = NULL;
    HmppResult result = HMPPI_HistogramInit(HMPP8U, levels, levelsLen, numChannels, &policy);
    if (result != HMPP_STS_NO_ERR) {
        printf("Histogram Init error: %d\n", result);
    }
    result = HMPPI_Histogram_8u_C3R(src, srcStep, roiSize, hist, policy);
    if (result != HMPP_STS_NO_ERR) {
        printf("Histogram error: %d\n", result);
    }
    HMPPI_HistogramRelease(policy);
    printf("hist:\n");
    for (int32_t i = 0; i < 3; i++){
        for (int32_t j = 0; j < levelsLen[i] - 1; j++){
            printf("%d ", hist[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    HistogramExample();
    return 0;
}
运行结果:
hist: 3 3 2 2 2 2 1 1 2