原理:
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