求和颜色值时使用位运算求和数字的最快方法
Fastest way to sum digits using bit operations when summing color values
我对数字求和的特殊情况处理以整数表示的颜色。 Java 函数 BufferedImage.getRGB
returns 0x00RRGGBB
格式的图像。我正在制作一个函数,可以为您提供图像上的灰度(与颜色无关)颜色总和。目前,我的操作看起来很幼稚:
//Just a pseudocode
int sum = 0;
for(x->width) {
for(y->height) {
int pixel = image.getRGB(x,y);
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
}
}
//The average value for any color then equals:
float avg = sum/(width*height*3);
我想知道是否可以使用一些位移逻辑来更快地完成它。我问这个问题主要是为了了解更多关于位移位的知识,因为我怀疑任何答案都会真正 显着.
加速程序
R、G 和 B 并不等同地归因于感知强度。比这更好的总结方式:
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
经过必要的位移和加权(假设 00RRGGBB):
sum+= ((pixel&0x00FF0000)>>16) * .30 / 255
+ ((pixel&0x0000FF00)>> 8) * .59 / 255
+ (pixel&0x000000FF) * .11 / 255;
您可能希望将 /255
部分留在此处,并用按比例放大的整数(如 30、59 和 11)替换浮点数,请记住您需要 long
sum
合理防止溢出
我对数字求和的特殊情况处理以整数表示的颜色。 Java 函数 BufferedImage.getRGB
returns 0x00RRGGBB
格式的图像。我正在制作一个函数,可以为您提供图像上的灰度(与颜色无关)颜色总和。目前,我的操作看起来很幼稚:
//Just a pseudocode
int sum = 0;
for(x->width) {
for(y->height) {
int pixel = image.getRGB(x,y);
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
}
}
//The average value for any color then equals:
float avg = sum/(width*height*3);
我想知道是否可以使用一些位移逻辑来更快地完成它。我问这个问题主要是为了了解更多关于位移位的知识,因为我怀疑任何答案都会真正 显着.
加速程序R、G 和 B 并不等同地归因于感知强度。比这更好的总结方式:
sum+=(pixel&0x00FF0000)+(pixel&0x0000FF00)+(pixel&0x000000FF);
经过必要的位移和加权(假设 00RRGGBB):
sum+= ((pixel&0x00FF0000)>>16) * .30 / 255
+ ((pixel&0x0000FF00)>> 8) * .59 / 255
+ (pixel&0x000000FF) * .11 / 255;
您可能希望将 /255
部分留在此处,并用按比例放大的整数(如 30、59 和 11)替换浮点数,请记住您需要 long
sum
合理防止溢出