2017-07-13 27 views
0

私持っているIPPは自分の行列サイズを変更持つように書かれた次のコード:IPP - 変換フロート行列は、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; 
} 

私は今、RGB24形式にこのフロート行列destを変換することを使用することができIPP機能はありますが、与えられたカラーマップ?

私はforループで手で行うことができますが、私が扱いたい生の行列ははるかに大きく、ループはそれをカットしないかもしれません。私は仕事に見つかっ

答えて

0

技術は、3つのステップで構成されています

  1. 変換/ unsigned char型にfloat値を切り捨てる - 私の場合、入力値は8ビットの範囲内にあると、私は気にしません10進数。
  2. 符号なしのchar値を、3つのチャネルすべてに同じ入力値を割り当てる3チャネルRGBグレー値に変換します。
  3. 3つのチャネル値を別の3つのチャネル値にマッピングするパレットを作成します。
  4. パレットと入力値をルックアップテーブル関数に渡します。

これは以下のコードで実証されています。これは非常に効率的なループが速かったため、単一のに働いていなかった、私のパレットが大きな値30及び青の下の値に対して緑色割り当てる設定であったか、最後に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; 
} 

より等しいことに留意されたいです。

関連する問題