MMX技术的应用

原创 2007年09月28日 08:23:00

实际项目中用到了彩色图像到灰度图像的转换,算法上没什么好说的,关键在于速度,国外的halcon的公司是公认的做图像处理算法很牛的公司,可是他们的这个彩色转灰度的函数还是比较满足不了实际的应用,为此,自己写这么一个函数,经过测试,我的这个函数在同样的测试环境下,速度是halcon的6倍。显示了MMX,SSE技术的强大。

void MMX_colortogray(_MMx_colortogray* rclData)
{
 _asm
 {
  
  mov  esi,rclData
   pxor MM1,MM1
   mov eax ,[esi]_MMx_colortogray.coefb
   
   
   movd MM7,eax
   PSHUFW MM7,MM7,0
   
   
   mov eax ,[esi]_MMx_colortogray.coefg
   
            movd MM6,eax
   PSHUFW MM6,MM6,0
   
   
   mov eax,[esi]_MMx_colortogray.coefr
   
   movd MM5,eax
   PSHUFW MM5,MM5,0
   
   
   
   mov  edi,[esi]_MMx_colortogray.colorprB
   mov  ebx,[esi]_MMx_colortogray.colorprG
   mov  eax,[esi]_MMx_colortogray.colorprR
           
   mov  edx,[esi]_MMx_colortogray.graypr
   mov  ecx,[esi]_MMx_colortogray.count
   
   test   ecx,ecx 
   lea  edi,[edi+4*ecx]
   lea  ebx,[ebx+4*ecx]
   lea  eax,[eax+4*ecx]
   lea  edx,[edx+4*ecx] 
   
   neg ecx
   push ebp
   
loop_start:
  
  movd MM0,[edi+4*ecx]
   PUNPCKLBW MM0,MM1
   
   movd MM2,[ebx+4*ecx]
   PUNPCKLBW MM2,MM1
   
   MOVD MM3,[eax+4*ecx]
   PUNPCKLBW MM3,MM1
   
   PMULLW MM0,MM7
   PMULLW MM2,MM6
   PMULLW MM3,MM5
   PADDUSW MM0,MM2
   PADDUSW MM0,MM3
   
   PSRLW MM0,8
   PACKUSWB MM0,MM0
   
   MOVD      [edx+4*ecx],MM0
   
   inc       ecx
   jnz       loop_start
   
   
   
 }
 _asm
 {
  pop ebp
   EMMS
 }
 
 

void MMX_ColorConvertGray(char* ColorprR,char *ColorprG,char* ColorprB ,
          char* Graypr,double r,double g,double b,
          long width,long height,RECT ROI)
{
 long lLinebytes=WIDTHBYTTE(width);
 
 _MMx_colortogray Tdata;
 char *prB=ColorprB+(ROI.top)*lLinebytes+ROI.left;
 char *prG=ColorprG+(ROI.top)*lLinebytes+ROI.left;
 char *prR=ColorprR+(ROI.top)*lLinebytes+ROI.left;
 long roi_width;
 long roi_height;
 roi_width=fabs(ROI.right-ROI.left)+1;
 roi_height=fabs(ROI.bottom-ROI.top)+1;
 long roi_linebytes=WIDTHBYTTE(roi_width);
 long lb=b*(1<<8);
 long lg=g*(1<<8);
 long lr=r*(1<<8);
 Tdata.coefb=lb;
 Tdata.coefg=lg;
 Tdata.coefr=lr;
 
 Tdata.count=(int)(roi_linebytes/4+1);
 char* copyprb=prB;
 char* copyprg=prG;
 char* copyprr=prR;
 char* copygary=Graypr;
 int y=0;
 while (true)
 {
  if(y>=roi_height-1) break;
  Tdata.colorprB=copyprb;
  Tdata.colorprG=copyprg;
  Tdata.colorprR=copyprr;
  Tdata.graypr=copygary;
  MMX_colortogray(&Tdata);
  copyprb+=lLinebytes;
  copyprg+=lLinebytes;
  copyprr+=lLinebytes;
  copygary+=roi_linebytes;
  ++y;
  
 }
 
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

mmx指令集简介 SIMD技术

  • 2011-02-10 12:48
  • 135KB
  • 下载

多媒体MMX技术文档

  • 2009-06-13 09:50
  • 470KB
  • 下载

SIMD函数整理:01 《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术

一、来源   来源:《PC平台新技术MMX(上册):开发编程指南》第8章 MMX编码技术   书籍信息—— http://e.360buy.com/30027396.html PC平台新技术M...
  • zyl910
  • zyl910
  • 2012-04-26 22:22
  • 1698

MMX汇编技术开发手册

  • 2009-12-23 00:33
  • 131KB
  • 下载

MMX指令集(详解)

转自 http://blog.csdn.net/dahan_wangtao/article/details/1944153 EMMS MMX状态置空: 将FP特征字置空(...

MMX指令集速查

  • 2017-07-22 18:46
  • 208KB
  • 下载

MMX和SSE

MMX MMX: 是MultiMedia eXtensions(多媒体扩展)的缩写,是第六代CPU芯片的重要特点。MMX技术是在CPU中加入了特地为视频信号(Video Signal),音频信号(A...

INTEL 体系结构 MMX

  • 2008-10-21 20:27
  • 350KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)