图像处理-基本算法之幂次变换

幂次变换的基本表达式为:y=cx r+b

其中c、r均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。

(1) 当r<0时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。

(2) 当r>0时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。

代码如下:

[cpp] [cpp]
[cpp]
  1. /******************************************************************************
  2. * 作用: 幂次变换函数
  3. * 参数: pDst 输出图像的像素数组
  4. * 参数: pSrc 原始图像的像素数组
  5. * 参数: nWidth 原始图像宽度
  6. * 参数: nHeight 原始图像高度
  7. * 参数: b 控制参数,表示曲线的上下偏移量
  8. * 参数: c 控制参数,表示曲线的弯曲程度
  9. * 参数: r 控制参数,表示函数的幂次
  10. * 备注: 此函数对于彩色图同样适用
  11. ******************************************************************************/
  12. int PowerTrans(BYTE* pDst, BYTE* pSrc, int nWidth, int nHeight, double b, double c, double r)
  13. {
  14. if (!pSrc || !pDst)
  15. {
  16. return EXIT_FAILURE;
  17. }
  18. // 映射表,用于256种灰度变换后的值
  19. BYTE map[256];
  20. // 保存运算后的临时值
  21. double dTemp;
  22. int i, j;
  23. for (i = 0; i < 256; i++)
  24. {
  25. // 计算当前像素变换后的值
  26. dTemp = c * pow(i / 255.0, r) * 255 + b;
  27. // 如果超界则修改其值
  28. if (dTemp < 0)
  29. dTemp = 0.0;
  30. else if (dTemp > 255)
  31. dTemp = 255;
  32. // 四舍五入
  33. map[i] = int(dTemp + 0.5);
  34. }
  35. for (i = 0; i < nWidth * nHeight; i++)
  36. {
  37. for (j = 0; j < 4; j++)
  38. pDst[i*4+j] = map[ pSrc[i*4+j] ];
  39. }
  40. return EXIT_SUCCESS;
  41. }
[cpp] /****************************************************************************** * 作用: 幂次变换函数 * 参数: pDst 输出图像的像素数组 * 参数: pSrc 原始图像的像素数组 * 参数: nWidth 原始图像宽度 * 参数: nHeight 原始图像高度 * 参数: b 控制参数,表示曲线的上下偏移量 * 参数: c 控制参数,表示曲线的弯曲程度 * 参数: r 控制参数,表示函数的幂次 * 备注: 此函数对于彩色图同样适用 ******************************************************************************/ int PowerTrans(BYTE* pDst, BYTE* pSrc, int nWidth, int nHeight, double b, double c, double r) { if (!pSrc || !pDst) { return EXIT_FAILURE; } // 映射表,用于256种灰度变换后的值 BYTE map[256]; // 保存运算后的临时值 double dTemp; int i, j; for (i = 0; i < 256; i++) { // 计算当前像素变换后的值 dTemp = c * pow(i / 255.0, r) * 255 + b; // 如果超界则修改其值 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; }
经验分享 程序员 微信小程序 职场和发展