如何在SSE中对图像通道进行去交织

时间:2016-03-08 15:38:33

标签: image-processing sse simd sse2

有没有什么办法可以像在霓虹灯下的代码那样对32bpp图像通道进行DE交错。

//Read all r,g,b,a pixels into 4 registers
uint8x8x4_t SrcPixels8x8x4= vld4_u8(inPixel32);

ChannelR1_32x4 = vmovl_u16(vget_low_u16(vmovl_u8(SrcPixels8x8x4.val[0]))), 
channelR2_32x4 = vmovl_u16(vget_high_u16(vmovl_u8(SrcPixels8x8x4.val[0]))), vGaussElement_32x4_high);

基本上我希望所有颜色通道都在单独的向量中,每个向量有4个32位元素进行一些计算,但我不太熟悉SSE,无法在SSE中找到这样的指令,或者如果有人可以提供更好的方法那?任何帮助都非常感谢

1 个答案:

答案 0 :(得分:2)

由于8位值是无符号的,你可以通过移位和屏蔽来实现这一点,就像对标量代码一样,例如。

__m128i vrgba;

__m128i vr = _mm_and_si128(vrgba, _mm_set1_epi32(0xff));
__m128i vg = _mm_and_si128(_mm_srli_epi32(vrgba, 8), _mm_set1_epi32(0xff));
__m128i vb = _mm_and_si128(_mm_srli_epi32(vrgba, 16), _mm_set1_epi32(0xff));
__m128i va = _mm_srli_epi32(vrgba, 24);

请注意,我假设您的RGBA元素在LS 8位中具有R分量而在MS 8位中具有A分量,但是如果它们是相反的字节序,则可以仅更改{{的名称1}} / vr / vg / vb向量。