ipp - 将浮点矩阵转换为rgb

时间:2017-07-13 15:14:34

标签: c++ image matrix intel-ipp

我编写了以下代码,让IPP调整我的矩阵:

#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;
}

我是否可以使用IPP功能现在将此浮点矩阵dest转换为RGB24格式,给定颜色贴图?

我知道我可以在for循环中手动完成,但是我想要处理的原始矩阵要大得多,而且循环可能不会削减它。

1 个答案:

答案 0 :(得分:0)

我发现的技术包括3个步骤:

  1. 将float值转换/截断为unsigned char - 在我的情况下,输入值在8位范围内,我不关心十进制数。
  2. 将unsigned char值转换为3通道RGB灰色,它基本上为所有3个通道分配相同的输入值。
  3. 构建一个调色板,将3个通道值映射到另外3个通道值。
  4. 将调色板和输入值传递给查找表函数。
  5. 以下代码对此进行了演示。请注意,我的调色板设置为为30以下的值指定绿色,为值大于或等于30指定蓝色。

    import os
    EMAIL_HOST_USER = os.environment.get('EMAIL_HOST_USER')
    

    最后,这不是非常有效,并且在单个for循环上工作更快。