如何用SSE2/SSE3/SSE4处理24位3通道彩色图像



我刚开始使用SS2优化图像处理,但对于3通道24位彩色图像却一无所知。我的图片数据由BGR BGR BGR…,unsigned char 8-bi,所以如果我想实现Color2Gray与SSE2/SSE3/SSE4的指令C/c++的乐趣,我该怎么做?我的图片数据需要对齐(4/8/16)吗?我看过一篇文章:http://supercomputingblog.com/windows/image-processing-with-sse/但它是ARGB 4通道32位彩色,每次精确处理4色像素数据。谢谢!

//Assume the original pixel:
      unsigned char* pDataColor=(unsigned char*)malloc(src.width*src.height*3);//3
  //init pDataColor every pix val
  // The dst pixel:
  unsigned char* pDataGray=(unsigned char*)malloc(src.width*src.height*1);//1 

//RGB ->灰色:Y = 0.212671 * R + 0.715160 * 0.072169 G + * B

我有关于24位RGB像素去交错的幻灯片,其中解释了如何使用SSE2和SSSE3。

以下是对你问题的一些回答:

  • 关于如何使用SSE2指令的C/c++函数。这些参考资料可能会有帮助。
    • 图像处理算法的优化:一个案例研究
    • 加速一些SSE2内部的颜色转换
    • SSE本征函数参考
  • 对于对齐:是的,16字节对齐是必要的。当使用SSE2固有函数(SSE2/SSE3/SSE4指令C/c++函数)访问内存时,您应该确保内存地址为16字节对齐。如果你使用MSVC,你必须使用declspec(align(16)),或者使用GCC,这将是__attribute((aligned(16)))。
    • align是必要的原因可以在这里找到:为什么指令/数据对齐存在?
  • 对于3通道RGB转换,我不是图像处理专家,所以不能给出建议。也有一些开源的图像处理库,可能已经包含了你想要的代码。

最新更新