RGB图像彩色直方图统计,C++

本文介绍了一个用于计算彩色图像直方图并找出最大颜色值的原创算法。通过遍历图像的每个像素,统计RGB各通道的颜色频率,然后合并数组并使用快速查找算法确定最高频率的颜色位置。

该函数的功能为计算彩色直方图,并返回最大值。

本人原创代码,转载或引用请注明出处。

void ColorEnhance::getMaxcolor(Mat &image,int *max_color)
{
    int **temp_array=NULL;
    int *merge;
    merge = new int[MAX_LENGTH];
    temp_array = new int *[CHANNELS];
    for (int i = 0;i < CHANNELS;i++)
    {
        if (i == 0)
            merge[i] = { 0 };
        temp_array[i] = new int[MAX_LENGTH];
        memset(temp_array[i], 0, MAX_LENGTH * sizeof(int));
    }
    
    for (int i = 0;i < image.rows;i++)
    {
        for (int j = 0;j < image.cols;j++)
        {
            temp_array[0][(int)image.at<Vec3b>(i, j)[0]]++;  //2017版本的vs需要强制转换成int型数据;
            temp_array[1][(int)image.at<Vec3b>(i, j)[1]]++;
            temp_array[2][(int)image.at<Vec3b>(i, j)[2]]++;
        }
    }
    Merge_arrray_Pri(temp_array[0], temp_array[1], temp_array[2], merge);
    int max_pos = Quick_search(merge);
    max_color[0] = temp_array[0][max_pos];
    max_color[1] = temp_array[1][max_pos];
    max_color[2] = temp_array[2][max_pos];
    for (int i=0;i < CHANNELS;i++)
    {
        if (temp_array[i] != NULL)
        {
            delete temp_array[i];
            temp_array[i] = NULL;
        }
            
    }
    delete[] temp_array;
    temp_array = NULL;
    delete[] merge;
    merge = NULL;
}

void ColorEnhance::Merge_arrray_Pri(int *array1, int *array2, int *array3, int *output)
{
    int Arry_legth1 = sizeof(array1) / sizeof(array1[0]);
    int Arry_legth2 = sizeof(array2) / sizeof(array2[0]);
    int Arry_legth3 = sizeof(array3) / sizeof(array3[0]);
    try {
        if ((Arry_legth1 == 0) || (Arry_legth2 == 0) || (Arry_legth3 == 0))
            throw 0;
        if ((Arry_legth1 != Arry_legth2) || (Arry_legth1 != Arry_legth3) || (Arry_legth3 != Arry_legth2))
            throw 1;
        else
        {
            for (int i = 0;i < Arry_legth1;i++)
                output[i] = array1[i] + array2[i] + array3[i];
        }
    }
    catch (int e)
    {
        switch (e)
        {
        case 0:
            cout << "one of the arrays is empty!" << endl;
            break;
        case 1:
            cout << "Inputed arrays are not euqaled-length!" << endl;
            break;
        default:
            cout << "unknow error!" << endl;
            break;
        }
    }
}

int ColorEnhance::Quick_search(int *input)
{
    int Arry_legth = sizeof(input) / sizeof(input[0]);
    assert(Arry_legth == 0);
    int max_num = 0;
    int k = 0;
    max_num = input[0];
    for (int i = 0;i < Arry_legth;i++)
    {
        if (max_num < input[i])
        {
            max_num = input[i];
            k = i;
        }
    }
    return k;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值