So beschleunigen Sie die Bilineare interpolation von Bild?

Ich versuche eine Drehung des Bildes mit interpolation, aber es ist zu langsam für Echtzeit für große Bilder.

den code so etwas wie:

for(int y=0;y<dst_h;++y)
{
    for(int x=0;x<dst_w;++x)
    {
        //do inverse transform
        fPoint pt(Transform(Point(x, y)));

        //in coor of src
        int x1= (int)floor(pt.x);
        int y1= (int)floor(pt.y);
        int x2= x1+1;
        int y2= y1+1;


        if((x1>=0&&x1<src_w&&y1>=0&&y1<src_h)&&(x2>=0&&x2<src_w&&y2>=0&&y2<src_h))
        {
                Mask[y][x]= 1; //show pixel

                float dx1= pt.x-x1;
                float dx2= 1-dx1;
                float dy1= pt.y-y1;
                float dy2= 1-dy1;

                //bilinear
                pd[x].blue= (dy2*(ps[y1*src_w+x1].blue*dx2+ps[y1*src_w+x2].blue*dx1)+
                        dy1*(ps[y2*src_w+x1].blue*dx2+ps[y2*src_w+x2].blue*dx1));
                pd[x].green= (dy2*(ps[y1*src_w+x1].green*dx2+ps[y1*src_w+x2].green*dx1)+
                        dy1*(ps[y2*src_w+x1].green*dx2+ps[y2*src_w+x2].green*dx1));
                pd[x].red= (dy2*(ps[y1*src_w+x1].red*dx2+ps[y1*src_w+x2].red*dx1)+
                        dy1*(ps[y2*src_w+x1].red*dx2+ps[y2*src_w+x2].red*dx1));

                //nearest neighbour
                //pd[x]= ps[((int)pt.y)*src_w+(int)pt.x];
        }
        else
                Mask[y][x]= 0; //transparent pixel
    }
    pd+= dst_w;
}

Wie kann ich beschleunigen diesen code versuche ich zu parallelisieren mit diesem code, aber es scheint, gibt es keine Beschleunigung, weil der memory access pattern (?).

  • Es scheint angemessen, für das codereview.se
  • Sie können auch die Intel IPP Bibliothek, die eine optimierte Funktion für die Bilineare interpolation. Diese lib optimiert für beide SIMD-Anweisungen (schneller single-thread-Leistung) und für die multicore-Nutzung, in einigen Fällen zu. Der einzige Nachteil ist, dass dieses SDK ist payware. Wenn das nicht funktioniert, für Ihre Bedürfnisse, dann sollten Sie versuchen, die OpenMP.
InformationsquelleAutor mrgloom | 2014-03-04
Schreibe einen Kommentar