void PowerTrans(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height, double b, double c, double r)
{
BYTE map[256];
double dTemp;
for (int i = 0; i < 256; i++){
dTemp = c * pow((double)i / 255.0, r) * 255.0 + b;
if (dTemp < 0) dTemp = 0.0;
else if (dTemp > 255) dTemp = 255;
//四舍五入
map[i] = int(dTemp + 0.5);
}
for (UINT i = 0; i < width * height; i++){
tempPixel[i] = map[pixel[i]];
}
}
仅针对连续存储的灰度数据。
假设c和b都为0,主要的变量为r
1.当r>1时,图像中高灰度值区域的对比度得到增强。
2.当r<1时,图像中低灰度值区域的对比度得到增强。
3.当r=1时,为线性变换,不改变图像的值。
该处要注意i前面的(double),255后的小数点不能省,不然得出的dTemp恒为0.00000.
原因是计算式结果被强制转换成了int,另外作为中括号中的索引最好加上int,作用是截断小数点。
以下变换采用b=0.0,c=1.0,r=0.5,针对低灰度值区域增强其对比度。
变换前:
变换后:
来源:CSDN
作者:Issac_etc
链接:https://blog.csdn.net/weixin_41303851/article/details/103463965