定义一个修改原始图像直方图的查找表可以提高图像的对比度。我们可以通过伸展直方图来生成一个对比度更高的图像。为此要使用一个百分比阈值,表示伸展后图像的最小强度值(0)和最大强度值(255)像素的百分比。
我们必须在强度值中找到最小值(imin)和最大值(imax),使得所要求的最小的像素数量高于阈值指定的百分比。这可以用以下几个循环(其中 hist 是计算得到的一维直方图)实现:
// 像素的百分比
float number= image.total()*percentile;
// 找到直方图的左极限
int imin = 0;
for (float count=0.0; imin < 256; imin++) {
// 小于或等于 imin 的像素数量必须>number
if ((count+=hist.at<float>(imin)) >= number)
break;
}
// 找到直方图的右极限
int imax = 255;
for (float count=0.0; imax >= 0; imax--) {
// 大于或等于 imax 的像素数量必须> number
if ((count += hist.at<float>(imax)) >= number)
break;
}
然后重新映射强度值,使 imin 的值变成强度值 0,imax 的值变成强度值 255。两者之间的 i 进行线性映射:
255.0*(i-imin)/(imax-imin);