这个公式是重复的还是最优的

时间:2013-03-21 18:41:43

标签: c# mathematical-optimization

我已经开始使用不同的图像处理算法编写图像处理程序,主要来自RenéSchulte的工作,在基准测试时,我注意到我可以从不同来源找到的所有效果,应用'Softlight的代码'效果最慢。我不擅长优化方程式,但我觉得过滤器是基于一个可能没有理由重复变量的公式。

这可以用更短或更快的方式进行总结吗?

// Basically, b is from Image A, and t from Image B
int csoftLight(float b, float t)
      {
          b /= 255;
          t /= 255;

          return (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
       }

[编辑 - 结果使用Mohammed Hossain的方程式发现PS中的柔光]

// Input: 137 and 113

// Byte version:
int other = ((byte)((B < 128) ? (2 * ((A >> 1) + 64)) * ((float)B / 255) : (255 - (2 * (255 - ((A >> 1) + 64)) * (float)(255 - B) / 255))));
// Returns 116    


// float version:
int res = (int)((t < 0.5) ? 255 * ((1 - 2 * t) * b * b + 2 * t * b) : 255 * ((1 - (2 * t - 1)) * b + (2 * t - 1) * (Math.Pow(b, 0.5))));
// Returns 129

[编辑]

这是基于Mohammed Hossain回答的最快算法:

int csoftLight(byte A, byte B)
{
    return (int)((A < 128) ? (2 * ((B >> 1) + 64)) * ((float)A / 255) : (255 - (2 * (255 - ((B >> 1) + 64)) * (float)(255 - A) / 255)));          
}

1 个答案:

答案 0 :(得分:4)

这个答案可以帮助你澄清一些事情:How does photoshop blend two images together?

其中一个方程是软光算法。

#define ChannelBlend_SoftLight(A,B) ((uint8)((B < 128)?(2*((A>>1)+64))*((float)B/255):(255-(2*(255-((A>>1)+64))*(float)(255-B)/255)))) //not very accurate

重要的是避免了昂贵的平方根操作,并且不太重要的是使用位移算子代替除以2(无论如何应该由智能编译器优化)。它还使用比浮动操作更多的整数运算,这更快。

这是另一个公式(由this的所有者提供,它可以切换变量的操作,而且看起来很有效......

#define ChannelBlend_SoftLight(A,B) (uint8)(((A < 128) ? (2 * ((B >> 1) + 64)) * ((float) A / 255) : (255 - (2 * (255 - ((B >> 1) + 64)) * (float) (255 - A) / 255))));