一个图象处理的问题,有把图象上的颜色变的更深的算法吗?
比如绿色更绿,黄色更黄,红色更红,
总之是在正常的情况下让图片颜色更加鲜亮。

解决方案 »

  1.   

    把每个颜色分量都乘上一个系数不就可以了吗?
    比如,提取rgb颜色数值,各自乘上1.2,
    red = red * 1.2;
    if (red>255) red = 255;再复制回去
      

  2.   

    个人觉得应该先将RGB转换为HSL颜色空间。即色调、色饱和度和亮度三个分量,然后保持色调不变,提高色饱和度和亮度分量就可以了。
    这里提供一个转换函数:
    //H色调
    //S饱和度
    //L亮度
    #define min(a,b) (((a)<(b))?(a):(b))#define max(a,b) (((a)>(b))?(a):(b))#define bmax 100.0 //Input HSL channel maximum#define cmax 255.0 //Output color maximum    void HslToRgb(double h, double s, double L, double& r, double& g, double& b) {     h *= cmax*6.0/bmax;     s *= cmax/bmax;     L *= cmax/bmax;     r = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h, 6.0*cmax)) - cmax));     g = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 4.0*cmax, 6.0*cmax)) - cmax));     b = min(cmax, max(0.0, fabs(3.0*cmax - fmod(h + 2.0*cmax, 6.0*cmax)) - cmax));         if (L > cmax/2) {         r = (L*2/cmax-1)*(cmax-r) + r;         g = (L*2/cmax-1)*(cmax-g) + g;         b = (L*2/cmax-1)*(cmax-b) + b;         }             else {             r *= L*2/cmax;             g *= L*2/cmax;             b *= L*2/cmax;             }             double ave = (r + g + b)/3.0;             r = (1.0-s/cmax)*(ave - r) + r;             g = (1.0-s/cmax)*(ave - g) + g;             b = (1.0-s/cmax)*(ave - b) + b;        }
      

  3.   

    同意 ddmor ,其他人说的就是调节亮度,亮度并不能使图象鲜亮
      

  4.   

    如果单纯在RGB上乘一个系数是不对的,比如(255,240,240)和(255,220,220)乘上1.2后都成了(255,255,255),这是不合理的
      

  5.   

    ddmor说的有道理,转换成HSL颜色空间再处理
      

  6.   

    http://www.easyrgb.com/math.php?MATH=M18
    这个是一个关于各种颜色空间相互转换公式的网站对于楼主的这个问题,转换颜色空间的代价比较高,而且效果上也相差不了多少
    所以直接乘一个系数是最简单的办法