图像处理-基本算法之线性变换

来源:互联网 发布:h&m淘宝 编辑:程序博客网 时间:2024/06/06 09:47
线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。

     其公式可以表示为y(x, y) = k * x(x, y) + b;其中y(x, y)表示目标像素值,x(x, y)表示源像素值,k表示斜率,b表示截距。 

    1)当k>1时,可用于增加图像的对比度。图像的像素值在变换后全部增大,整体显示效果被增强。

    2)当k=1时,常用于调节图像亮度。

    3)当0<k<1时,效果与k>1时刚刚相反,图像的对比度和整体效果都被削弱。

    4)当k<0时,源图像较亮的区域变暗,而较暗的区域会变亮。此时可以使函数中的k=-1,d=255让图像实现反色效果。

     代码如下:

[cpp] view plaincopyprint?
  1. /******************************************************************************    
  2. *   作用:     线性变换函数
  3. *   参数: pDst     输出图像的像素数组
  4. *   参数: pSrc     原始图像的像素数组
  5. *   参数: nWidth   原始图像宽度
  6. *   参数: nHeight  原始图像高度
  7. *   参数: slope      线性函数的斜率
  8. *   参数: inter      线性函数的截距
  9. *   备注: 此函数对于彩色图同样适用
  10. ******************************************************************************/ 
  11. int LineTrans(BYTE* pDst,BYTE* pSrc, int nWidth,int nHeight, double slope,double inter) 
  12.     if (!pSrc || !pDst) 
  13.     { 
  14.         return EXIT_FAILURE; 
  15.     } 
  16.  
  17.     // 灰度映射表 
  18.     BYTE map[256]; 
  19.  
  20.     // 保存运算后的临时值 
  21.     double dTemp; 
  22.     int i, j; 
  23.     for (i = 0; i < 256; i++) 
  24.     { 
  25.         // 计算当前像素变换后的值 
  26.         dTemp = slope * i + inter; 
  27.  
  28.         // 如果超界则修改其值 
  29.         if (dTemp < 0) 
  30.             dTemp = 0.0; 
  31.         else if (dTemp > 255) 
  32.             dTemp = 255; 
  33.  
  34.         // 四舍五入 
  35.         map[i] = int(dTemp + 0.5); 
  36.     } 
  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.     return EXIT_SUCCESS; 

  

原创粉丝点击