直方图规格化C++代码实现

//直方图规格化
void SpecifyHistogram(const Mat& src, const Mat& dst, Mat& out) {
    assert(src.cols == dst.cols && src.rows == dst.rows);
    assert(src.cols == dst.cols && out.rows == out.rows);
    //计算直方图
    auto src_hist = CalHistgram(src);
    auto dst_hist = CalHistgram(dst);

    //初始化
    vector<vector<double>>src_p(256);
    vector<vector<double>>dst_p(256);
    vector<vector<double>>map(256);
    for (int i = 0; i < src_p.size(); ++i) {
        src_p[i].resize(3);
        dst_p[i].resize(3);
        map[i].resize(3);
    }

    int total = src.cols * src.rows;
    //累积分布
    for (int i = 0; i < src_p.size(); ++i) {
        for (int j = 0; j < src_p[i].size(); ++j) {
            src_p[i][j] = (i == 0 ? 0 : src_p[i - 1][j]) + src_hist[i][j] * 1.0 / total;
            dst_p[i][j] = (i == 0 ? 0 : dst_p[i - 1][j]) + dst_hist[i][j] * 1.0 / total;
        }
    }
    //建立映射
    for (int k = 0; k < 3; ++k) {
        for (int i = 0; i < map.size(); ++i) {
            int index = 0;
            double min_val = fabs(src_p[i][k] - dst_p[0][k]);
            for (int j = 1; j < map.size(); ++j) {
                double val = fabs(src_p[i][k] - dst_p[j][k]);
                if (min_val > val) {
                    min_val = val;
                    index = j;
                }
            }
            map[i][k] = index;
        }
    }
    //规格化
    for (int row = 0; row < src.rows; row++)
    {
        for (int col = 0; col < src.cols; col++)
        {
            auto vec3b = src.at<Vec3b>(row, col);
            auto& out_vec3b = out.at<Vec3b>(row, col);
            out_vec3b[0] = saturate_cast<uchar>(map[vec3b[0]][0]);
            out_vec3b[1] = saturate_cast<uchar>(map[vec3b[1]][1]);
            out_vec3b[2] = saturate_cast<uchar>(map[vec3b[2]][2]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值