2017-07-13 3 views
0

Ich habe das geschrieben folgenden Code hat IPP meine Matrix der Größe:ipp - Konvertieren von float Matrix rgb

#include "ipp_mx.h" 
#include "ipp.h" 

#include "stdafx.h" 
#define IPPCALL(name) name 

int main() 
{ 
    IppiSize srcSize = { 3,3 }; 
    float srcImage[9] = 
    { 20, 40, 30, 
     35, 55, 70, 
     100, 30, 20 }; 
    float* src = new float[srcSize.width*srcSize.height]; 
    for (int i = 0; i < srcSize.width*srcSize.height; i++) { 
     src[i] = srcImage[i]; 
    } 
    double xFactor = 10; double yFactor = 10; 

    int numChannels = 1; 
    int bytesPerPixel = 4; 
    int srcStep = srcSize.width*bytesPerPixel*numChannels; 
    IppiRect srcRoi = { 0, 0, srcSize.width, srcSize.width }; 

    float* dest = new float[srcSize.width*srcSize.height*xFactor*yFactor]; 
    IppiSize destSize = { srcSize.width*xFactor, srcSize.height*yFactor }; 
    int destStep = destSize.width*bytesPerPixel*numChannels; 
    IppiRect destRoi = { 0, 0, destSize.width, destSize.width }; 

    double xShift = 0; double yShift = 0; 

    int interpolation = 1; //nearest neighbour 

    int bufSize; 
    IPPCALL(ippiResizeGetBufSize)(srcRoi, destRoi, 1, interpolation, &bufSize); 
    unsigned char* buffer = new unsigned char[bufSize]; 

    IPPCALL(ippiResizeSqrPixel_32f_C1R)(src, srcSize, srcStep, srcRoi, dest, destStep, destRoi, xFactor, yFactor, xShift, yShift, interpolation, buffer); 
    return 0; 
} 

Gibt es eine IPP-Funktion kann ich das jetzt verwenden wandelt diesen Schwimmer Matrix dest zu einem RGB24-Format, eine Farbkarte gegeben?

Ich weiß, ich kann es in einer for-Schleife von Hand machen, aber die rohen Matrizen, mit denen ich arbeiten möchte, sind viel größer und für Schleifen möglicherweise nicht schneiden.

Antwort

0

Die Technik, die ich zur Arbeit gefunden besteht aus 3 Schritten:

  1. konvertieren/den float-Wert zu unsigned char gestutzt - in meinem Fall die Eingangswerte liegen innerhalb des 8-Bit-Bereich, und ich kümmere mich nicht um die Dezimalzahlen.
  2. Konvertieren Sie den vorzeichenlosen Zeichenwert in 3-Kanal-RGB-Grau, das im Wesentlichen allen drei Kanälen dieselben Eingabewerte zuweist.
  3. Konstruieren Sie eine Palette, um 3 Kanalwerte auf weitere 3 Kanalwerte abzubilden.
  4. Übergeben Sie die Palette und den Eingabewert an eine Nachschlagetabellenfunktion.

Dies wird im folgenden Code gezeigt. Beachten Sie, dass meine Palette Setup war größer für Werte für Werte unter 30 und blau grün zuweisen oder gleich als 30.

unsigned char** GeneratePalette() 
{ 
    unsigned char red[256]; 
    unsigned char green[256]; 
    unsigned char blue[256]; 

    for(int value = 0; value < 256; value++) 
    { 
     if(value < 30) 
     { 
      red[value] = 0; 
      green[value] = 255; 
      blue[value] = 0; 
     } 
     else 
     { 
      red[value] = 0; 
      green[value] = 0; 
      blue[value] = 255; 
     } 
    } 

    unsigned char* table[3] = { red, green, blue }; 
    return table; 
} 

void Test() 
{ 
    unsigned char** palette = GeneratePalette(); 
    IppiSize srcSize = { 2,1 }; 
    float src[2] = { 54, 19 }; 
    unsigned char truncated[2]; 

    IPPCALL(ippiConvert_32f8u_C1R)(src, srcSize.width * sizeof(float), truncated, srcSize.width * sizeof(unsigned char), srcSize, ippRndZero); 
    unsigned char copied[6] = {0}; 
    IPPCALL(ippiGrayToRGB_8u_C1C3R)(truncated, srcSize.width * sizeof(unsigned char), copied, srcSize.width * sizeof(unsigned char) * 3, srcSize); 
    unsigned char dest[6]; 

    IPPCALL(ippiLUTPalette_8u_C3R)(copied, 6, dest, 6, srcSize, palette, 8); 
} 

int main() 
{ 
    Test(); 
    return 0; 
} 

Am Ende war dies nicht sehr effizient und arbeitet an einem einzigen for-Schleife schneller war.