C 最快3、无符号短最大/最小值或RGB排序->;色调计算,图形特定

C 最快3、无符号短最大/最小值或RGB排序->;色调计算,图形特定,c,rgb,hue,C,Rgb,Hue,从Photoshop 16位/通道原始文件读取的6字节内存卡盘中存储的3条无符号短裤中找到最大值、最小值和最大值的最快方法是什么 将6个字节的内存分为hi、med和low会很有效,这样我就不会有两个函数调用max和min 我正在构建一个工具,以创建一个从36 MPix、108MB、D800E NEF文件开发为16位/chan.RAW的HUEstogram,因此它必须尽可能快。它与柱状图类似,不同之处在于它在X轴上的角度为0-360°,而不是通常的强度箱1-255。Y轴上每格的像素计数 我有一台带

从Photoshop 16位/通道原始文件读取的6字节内存卡盘中存储的3条无符号短裤中找到最大值、最小值和最大值的最快方法是什么

将6个字节的内存分为hi、med和low会很有效,这样我就不会有两个函数调用max和min

我正在构建一个工具,以创建一个从36 MPix、108MB、D800E NEF文件开发为16位/chan.RAW的HUEstogram,因此它必须尽可能快。它与柱状图类似,不同之处在于它在X轴上的角度为0-360°,而不是通常的强度箱1-255。Y轴上每格的像素计数

我有一台带有AES和AVX的英特尔2600k。必须有一种方法使用SSE4.2寄存器来实现这一点。我已经有了以下可能的选择:

-O3 -ffast-math -m64 -Ofast -march=corei7-avx 
我有GCC4.8.3/64(草莓Perl)、VC10.0和TCC0.9.2632/64、win7/64。我想编译它完全到金属没有任何可移植性的考虑。如果可以保存不必要的字节交换,我可以在Photoshop file->save中为endian ness指定IBM_PC或MAC

这里和其他地方提出了各种宏、函数调用、汇编程序、SSE2:_mm_mulhi_epu16等解决方案,但没有一种是针对无符号短路的,无符号短路可以大大简化解决方案,而无需处理讨厌的符号位。并且,没有适用于ushort[3]->[Max,Min,Max-Min]

整个标准计算(色调部分)来自:

需要3个U端口(R、G和B)并将最大、最小和增量大小复制到一个数组中有多难? 这里没有太多其他明显的优化


我知道有一个汇编程序解决方案可以用2英寸的代码完成这项工作

在当前形式中,您提供的代码对于整数颜色组件没有意义,特别是对于无符号颜色组件。整数除法和下溢会有严重的问题。例如,考虑“<代码> r==max ”的情况。那么
g-b
的期望值必须小于
delta
,因此如果
g>b
1
如果
g==r
,整数商
(g-b)/delta
将为
0
,如果
g
,则为
1
,或者一些太大的数字。最后,使用16位无符号颜色组件在某些方面简化了问题,但在其他方面则更加棘手

为了解决这些问题,您必须将除法(和模运算)操作推迟到尽可能晚的时间,并确保命令操作以避免任何下溢的可能性。执行此操作时,还必须注意避免溢出,这需要对许多中间值使用大于16位的类型

此外,请注意,通过避免不可预测的分支,性能得到了显著提高,为此,三元运算符通常优于
if
/
else
,因为它通常可以在没有分支的情况下实现

您需要这样做:

uint16_t r, g, b;
uint32_t h, max, min, delta;

max = (r < g) ? g : r;
min = (r + g) - max;
max = (max < b) ? b : max;
min = (min < b) ? min : b;
delta = max - min;

if( r == max )  h = (6 * delta + g) - b;
else if( g == max )  h = (8 * delta + b) - r;
else  h = (10 * delta + r) - g;

// hue bin computation:
hue_bin = ((uint32_t) (((uint64_t) h * 60 * bin_count) / (delta << 16))) % bin_count;
uint16\u t r,g,b;
uint32_t h,最大值,最小值,增量;
最大值=(r色调比=((uint32比)h*60比计数)/(德尔塔我知道有一个用1英寸的代码就能做到这一点——使用5-pt字体。约翰,我喜欢你奇特的最大/最小渐进近似值。在Perl中,它很有效。在C中,我确实担心过流/欠流。对于我的应用程序,肤色分析,红色最多占99.99%。蓝色总是最后一个,除了在潘多拉上。我要做两个奇怪的图片e处理;rgb->色调->rgb,sat=val=1.0,rgb->色调/16视为灰度。在改变温度/色调的同时,以bin*计数作为力臂计算色调重心是主要实验。谢谢1E9!
void crunch(unsigned short r, g, b, *min_max_del)  OR
void crunch(rgb, *min_max_del);  // Where RGB is 6 byte blob with 3 UINTS
uint16_t r, g, b;
uint32_t h, max, min, delta;

max = (r < g) ? g : r;
min = (r + g) - max;
max = (max < b) ? b : max;
min = (min < b) ? min : b;
delta = max - min;

if( r == max )  h = (6 * delta + g) - b;
else if( g == max )  h = (8 * delta + b) - r;
else  h = (10 * delta + r) - g;

// hue bin computation:
hue_bin = ((uint32_t) (((uint64_t) h * 60 * bin_count) / (delta << 16))) % bin_count;