指数变换的基本表达式为:y=b
c(x-a)-1
其中参数b、c控制曲线形状,参数a控制曲线的左右位置。
指数变换的作用是扩展图像的高灰度级、压缩低灰度级。虽然幂次变换也有这个功能,但是图像经过指数变换后对比度更高,高灰度级也被扩展到了更宽的范围。
代码如下:
- /******************************************************************************
- * 作用: 指数变换函数
- * 参数: pDst 输出图像的像素数组
- * 参数: pSrc 原始图像的像素数组
- * 参数: nWidth 原始图像宽度
- * 参数: nHeight 原始图像高度
- * 参数: a 控制参数,表示曲线的左右偏移量
- * 参数: b,c 控制参数,表示曲线的弯曲程度
- * 备注: 此函数对于彩色图同样适用
- ******************************************************************************/
- int ExpTrans(BYTE* pDst, BYTE* pSrc, int nWidth, int nHeight, double a, double b, double c)
- {
- if (!pSrc || !pDst)
- {
- return EXIT_FAILURE;
- }
- // 映射表,用于256种灰度变换后的值
- BYTE map[256];
- // 保存运算后的临时值
- double dTemp;
- int i, j;
- for (i = 0; i < 256; i++)
- {
- // 计算当前像素变换后的值
- dTemp = pow(b, c * (i - a)) - 1;
- // 如果超界则修改其值
- if (dTemp < 0)
- dTemp = 0.0;
- else if (dTemp > 255)
- dTemp = 255;
- // 四舍五入
- map[i] = int(dTemp + 0.5);
- }
- for (i = 0; i < nWidth * nHeight; i++)
- {
- for (j = 0; j < 4; j++)
- pDst[i*4+j] = map[ pSrc[i*4+j] ];
- }
- return EXIT_SUCCESS;
- }