EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

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