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
  • 下载

INTEL体系结构MMX技术开发者手册

  • 2008年03月05日 17:19
  • 334KB
  • 下载

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
  • 1803

多媒体MMX技术文档

  • 2009年06月13日 09:50
  • 471KB
  • 下载

MMX汇编技术开发手册

  • 2009年12月23日 00:33
  • 131KB
  • 下载

MMX Intrinsics各函数介绍

MMX Intrinsics各函数介绍。

MMX指令集速查

  • 2017年07月22日 18:46
  • 208KB
  • 下载

水波特效演示(MMX优化版)

  • 2006年03月16日 00:00
  • 68KB
  • 下载

使用MMX/SSE汇编指令集优化视频开发

1、汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年...

INTEL 体系结构 MMX

  • 2008年10月21日 20:27
  • 350KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MMX技术的应用
举报原因:
原因补充:

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