我已经开始使用不同的图像处理算法编写图像处理程序,主要来自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)));
}
答案 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))));