Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 如何使用SSE2/SSE3/SSE4处理24位3通道彩色图像?_Optimization_Opencv_Image Processing_Instructions_Sse2 - Fatal编程技术网

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

Optimization 如何使用SSE2/SSE3/SSE4处理24位3通道彩色图像?,optimization,opencv,image-processing,instructions,sse2,Optimization,Opencv,Image Processing,Instructions,Sse2,我刚开始使用SS2优化图像处理,但对于3通道24位彩色图像没有任何概念。 我的pix数据由BGR BGR BGR安排,unsigned char 8-bi,那么如果我想用SSE2/SSE3/SSE4的指令C/C++fun实现Color2Gray,我该怎么做?我的pix数据是否需要对齐(4/8/16)? 我读过一篇文章: 但它是ARGB 4通道32位彩色的,每次都精确地处理4色pix数据。 谢谢 //Assume the original pixel: unsigned char* p

我刚开始使用SS2优化图像处理,但对于3通道24位彩色图像没有任何概念。 我的pix数据由BGR BGR BGR安排,unsigned char 8-bi,那么如果我想用SSE2/SSE3/SSE4的指令C/C++fun实现Color2Gray,我该怎么做?我的pix数据是否需要对齐(4/8/16)? 我读过一篇文章: 但它是ARGB 4通道32位彩色的,每次都精确地处理4色pix数据。 谢谢

//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->Gray:Y=0.212671*R+0.715160*G+0.072169*B

以下是您问题的一些答案:

  • 了解如何使用SSE2指令C/C++函数。这些参考资料可能会有所帮助。
  • 对于对齐:是的,需要16字节对齐。当使用SSE2固有函数(SSE2/SSE3/SSE4指令C和C++函数)进行内存访问时,您应该确保内存地址是16字节对齐。如果使用MSVC,则必须使用GCC,否则将使用GCC。
    • 需要对齐的原因如下:
  • 对于3通道RGB转换,我不是图像处理专家,因此不能给出建议。还有一些开源图像处理库可能已经包含了您想要的代码

我有幻灯片,解释如何使用SSE2和SSSE3。

是的,谢谢。我已经将颜色RGB…RGB转换为RR…BB…GG,但当我尝试制作:RGB->Gray:Y=0.212671*R+0.715160*G+0.072169*B时,会出现问题。因为SSE使用128位,所以没有SSE C/C++指令可以像这样工作:_mm_mul xxx(a0,b0)r0=a0*b0,r1=a1*b0,…,r15=a15*b0;(a0是16种uchar类型,b0是2种双类型)。????对于颜色转换,通常使用定点算术而不是浮点运算。将8位值解压为16位值(使用_mm_unpaclo_epi8/_mm_unpachi_epi8),然后使用16位值的整数乘法。