zoukankan      html  css  js  c++  java
  • 多媒体指令(图像均值模糊)

    均值模糊原理很容易了,就不解释了。

    我测了一下,使用汇编的代码处理时间为1-2ms左右。

    cpp代码处理时间为3-4ms左右。

    这里只给出关键代码,其余代码见这里

    void asmMeanFilter(BitmapData *data)
    {
        UINT Height=data->Height;
        UINT s_Height=Height-1;
        UINT Width=data->Width;
        UINT s_Width=Width-1;
        Pix* p=(Pix*)data->Scan0;
    
        UINT h,w,i,j;
        __asm
        {
            push    esi;
            push    edi;
            pxor    mm7,mm7;
            mov        esi,[p];
            mov        edi,[p];
    
            mov        h,1;
    h_loop:
            mov        w,1;
    w_loop:
            pxor    mm1,mm1;
    
            mov        ecx,h;
            dec        ecx;
            mov        i,ecx;
    i_loop:
            mov        edx,w;
            dec        edx;
            mov        j,edx;
    j_loop:
            mov        eax,i;
            mov        ebx,Width;
            mul        ebx;
            add        eax,j;
            mov        ebx,4;        //每个像素占4字节
            mul        ebx;
            movd    mm0,[esi+eax];
    
            punpcklbw    mm0,mm7;
            paddw       mm1,mm0;
    
            inc        j;
            mov        edx,w;
            add        edx,2;
            cmp     edx,j;
            jnz        j_loop;        //end j loop
    
            inc        i;
            mov        ecx,h;
            add        ecx,2;
            cmp        ecx,i;
            jnz        i_loop;        //end i loop
            
            movq        mm2,mm1;
            movq        mm3,mm1;
            psrlw        mm1,4;        //寄存器中每个word右移四位
            psrlw        mm2,5;
            psrlw        mm3,6;
            paddw        mm1,mm2;
            paddw        mm1,mm3;    //这里本来是mm1每个word除9的,我用1/16+1/32+1/64模拟了
    
            packuswb    mm1,mm7;    //将字缩并为字节
    
            mov        eax,h;
            mov        ebx,Width;
            mul        ebx;
            add        eax,w;
            mov        ebx,4;
            mul        ebx;
            movd    [edi+eax],mm1;
            mov        [edi+eax+3],0xff;    //图像alpha通道置255
    
            inc        w;
            mov        ebx,w;
            cmp     ebx,s_Width;
            jnz     w_loop;        //end w loop
    
            inc        h;
            mov        eax,h;
            cmp     eax,s_Height;
            jnz        h_loop;        //end h loop
    
            pop        edi;
            pop        esi;
            emms;
        }    
    }
    
    VOID cppMeanFilter(BitmapData *data)
    {
        Pix* p=(Pix*)data->Scan0;
        for(UINT h = 1; h < data->Height-1;    ++h)
        {
            for(UINT w =1; w < data->Width-1; ++w)
            {
                unsigned int r,g,b;
                r=0;g=0;b=0;
                for (UINT i=h-1;i<=h+1;i++)
                {
                    for (UINT j=w-1;j<=w+1;j++)
                    {
                        r=p[j+i*data->Width].Red+r;
                        g=p[j+i*data->Width].Green+g;
                        b=p[j+i*data->Width].Blue+b;
                    }
                }
                p[w+h*data->Width].Red=r/9;
                p[w+h*data->Width].Green=g/9;
                p[w+h*data->Width].Blue=b/9;;
            
            }
        }    
    
    }

    处理效果:

  • 相关阅读:
    vfpConn
    OAuth2.0
    开源日志组件ELMAH
    c# 动态数组 ArrayList
    OleDbHelper类
    系统权限管理框架
    Log4net数据表
    C#创建DBF自由库
    数字化校园passport
    使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2971492.html
Copyright © 2011-2022 走看看