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

来源:互联网 发布:seo技术到底是什么 编辑:程序博客网 时间:2024/06/03 21:38
幂次变换的基本表达式为:y=cxr+b

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

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

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

   代码如下:

[cpp] view plaincopyprint?
  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.     if (!pSrc || !pDst) 
  14.     { 
  15.         return EXIT_FAILURE; 
  16.     } 
  17.  
  18.     // 映射表,用于256种灰度变换后的值 
  19.     BYTE map[256]; 
  20.  
  21.     // 保存运算后的临时值 
  22.     double dTemp; 
  23.     int i, j; 
  24.     for (i = 0; i < 256; i++) 
  25.     { 
  26.         // 计算当前像素变换后的值 
  27.         dTemp = c * pow(i / 255.0, r) * 255 + b; 
  28.  
  29.         // 如果超界则修改其值 
  30.         if (dTemp < 0) 
  31.             dTemp = 0.0; 
  32.         else if (dTemp > 255) 
  33.             dTemp = 255; 
  34.  
  35.         // 四舍五入 
  36.         map[i] = int(dTemp + 0.5); 
  37.     } 
  38.  
  39.     for (i = 0; i < nWidth * nHeight; i++) 
  40.     {    
  41.         for (j = 0; j < 4; j++) 
  42.             pDst[i*4+j] = map[ pSrc[i*4+j] ]; 
  43.     } 
  44.  
  45.     return EXIT_SUCCESS; 

原创粉丝点击