C实现直方图匹配

原理:
C实现图像直方图匹配
实现原理:
直方图匹配就是将目标图像的直方图变成指定的直方图。
由于直方图均衡可以把直方图变成概率上的均匀分布,所以,可以将原始直方图均衡,再将指定的直方图也均衡处理,理论上,两个直方图是相同的,然后再对均衡后的直方图按照指定的直方图均衡反映射,那么得到的图像就具有指定的直方图。

公式推导如下:
首先,对图像进行直方图均衡
这里写图片描述
对于图像,由于灰度级是离散的,不可能做到y=y^’完全相等,因此只需要做到他们之间的
绝对值最小即可。
这里写图片描述
这里写图片描述
这里写图片描述

代码实现:

void hist_matching(uint8_t* gray,float sh[256], int width, int height)
{
    int i;
    int j;
    int d;
    uint32_t sum;
    float s;
    float hist[256];
    float y[256];
    uint32_t h[256] = {0};
    uint8_t match[256];
    uint8_t* img;
    float diff;

    img = gray;
    for(i = 0; i < height; i++)
    {
        for(j = 0; j < width; j++)
        {
            h[*img++]++;
        }
    }

    sum = width * height;
    for (i = 0; i < 256; i++)
    {
        hist[i] = (float)h[i] / (float)sum;
    }
    s = 0.0;
    for(i = 0; i < 256; i++)
    {   
        s+=hist[i]; 
        y[i] = s;
    }

    s = 0.0;
    for(i = 0; i < 256; i++)
    {
        s += sh[i];
        sh[i] = s;
    }

    for (i=0; i < 256; i++)
    {   
        diff = 2.0;
        d = 0;
        for(j = 0; j < 256; j++)
        {
            if(diff > fabs(y[i] - sh[j]))
            {
                d = j;
                diff = fabs(y[i] - sh[j]);
            }
        }
        match[i] = d;
    }
    img = gray;
    for (i = 0; i < height; i++)
    {
        for(j = 0; j < width; j++)
        {
            *img = match[*img];
            img++;
        }
    }
}

指定的直方图图像:
这里写图片描述
需要匹配的图像:
这里写图片描述
指定的直方图:
这里写图片描述
匹配后的图像:
这里写图片描述
匹配后的图像的直方图:
这里写图片描述

算法实现参考链接:
http://fourier.eng.hmc.edu/e161/lectures/contrast_transform/node3.html

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值