C实现直方图匹配

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

公式推导如下:
首先,对图像进行直方图均衡
C实现直方图匹配_第1张图片
对于图像,由于灰度级是离散的,不可能做到y=y^’完全相等,因此只需要做到他们之间的
绝对值最小即可。
C实现直方图匹配_第2张图片
C实现直方图匹配_第3张图片
C实现直方图匹配_第4张图片

代码实现:

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++;
        }
    }
}

指定的直方图图像:
C实现直方图匹配_第5张图片
需要匹配的图像:
C实现直方图匹配_第6张图片
指定的直方图:
C实现直方图匹配_第7张图片
匹配后的图像:
C实现直方图匹配_第8张图片
匹配后的图像的直方图:
C实现直方图匹配_第9张图片

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

你可能感兴趣的:(图像处理,直方图匹配,图像处理,c语言)