直方图均衡化

直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.

函数 cvEqualizeHist 采用如下法则对输入图像进行直方图均衡化:

1,计算图像的直方图hist[256]
2,对直方图做归一化处理
3,对直方图做积分图
4,对原图用积分图做映射

void EqualizeHist(unsigned char *gray, int width, int height, float minValue) {
    int i, j;
    unsigned char *pbuf = NULL;
    float hist[256] = {0.0f};
    float fn[256] = {0.0f};

    Histogram(gray, width, height, hist);

    int min, max;//最小最大值
    for(i = 0; i < 256; i++) {
        if(hist[i] > minValue) {
            min = i;
            break;
        }
    }
    for(i = 255; i >= 0; i--) {
        if(hist[i] > minValue) {
            max = i;
            break;
        }
    }

    fn[0] = hist[0];//直方图的积分图
    for(i = 1; i < 256; i++) {
        fn[i] = fn[i - 1] + hist[i];
    }
    //图像关于直方图的映射
    for(j = 0; j < height; j++) {
        pbuf = gray + j * width;
        for(i = 0; i < width; i++, pbuf++) {
            *pbuf = fn[*pbuf] * (max - min) + min;
        }
    }

}

其中Histogram为归一化的直方图

void Histogram(unsigned char *gray, int width, int height, float hist[256]) {
    int i, j;
    int histogram[256] = {0};
    float size = (float)width * height;
    unsigned char *pBuf = NULL;
    //图像直方统计
    for (j = 0; j < height; j++) {
        pBuf = gray  + j * width; 
        for (i = 0; i < width; i++, pBuf++) {
            histogram[*pBuf] += 1;
        }
    }
    //直方图归一化
    for(i = 0; i < 256; i++) {
        hist[i] = histogram[i] / size;
    }
}

参考:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/histogram_equalization/histogram_equalization.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值