如何可视化数组数据?

时间:2018-07-16 14:47:43

标签: c++ image opencv magick++

我有三个二维数组,它们的大小和rgb的uint16_t值相同。因此,当这些数组完全用数据填充时(我将它们填充在一起,因此同时发生),我必须以PNG或JPG图像格式可视化这些数组,保存它,然后再次开始用新数据填充数组。我正在考虑为每种颜色创建具有3个字段的结构矢量,使用此数据结构mb可以更轻松地完成此任务。有人可以告诉我最好的方法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

如果您使用Magick ++,我相信您想使用Magick::Image.read方法。具体来说就是功能签名...

  

Magick ++ / Image.h   

// Read single image frame from an array of raw pixels, with
// specified storage type (ConstituteImage), e.g.
// image.read( 640, 480, "RGB", 0, pixels );
void read(const size_t width_,const size_t height_,const std::string &map_,
          const StorageType type_,const void *pixels_);

这将允许您从内存地址中任意读取栅格数据;只要您定义大小(宽度和高度),通道映射和存储大小即可。

  

我有三个二维数组,它们具有一定的大小,并为rgb提供了一些uint16_t值。

我建议将每个阵列“导入”到单个临时图像中,然后将每个颜色通道复合复制到最终图像中。

没有看到您的代码,我想您已经定义了这样的内容...

// Example 4x4 image broken into three 2d arrays.
uint16_t
    red[4][4]   = {
        {0xFFFF,0xFFFF,0xFFFF,0xFFFF},
        {0x9999,0x9999,0x9999,0x9999},
        {0x6666,0x6666,0x6666,0x6666},
        {0x0000,0x0000,0x0000,0x0000}
    },
    green[4][4] = {
        {0xFFFF,0x9999,0x6666,0x0000},
        {0xFFFF,0x9999,0x6666,0x0000},
        {0xFFFF,0x9999,0x6666,0x0000},
        {0xFFFF,0x9999,0x6666,0x0000}
    },
    blue[4][4]  = {
        {0x0000,0x0000,0x0000,0x0000},
        {0x6666,0x6666,0x6666,0x6666},
        {0x9999,0x9999,0x9999,0x9999},
        {0xFFFF,0xFFFF,0xFFFF,0xFFFF}
    };

因此过程将是:

  1. 为最终图像创建空白画布。
  2. 将每个2d数组加载到一个临时栅格中。
  3. 复合-将临时栅格复制到最终图像。
  4. 根据需要重复。

例如。

// Create blank canvas.
Magick::Image ctx;
ctx.size(Magick::Geometry(4, 4));

{// Build & copy RED channel.
    Magick::Image redImage;
    redImage.read(4, 4, "R", Magick::ShortPixel, red);
    ctx.composite(redImage, 0, 0, Magick::CopyRedCompositeOp);
}
{// Build & copy GREEN channel.
    Magick::Image greenImage;
    greenImage.read(4, 4, "G", Magick::ShortPixel, green);
    ctx.composite(greenImage, 0, 0, Magick::CopyGreenCompositeOp);

}
{// Build & copy Blue channel
    Magick::Image blueImage;
    blueImage.read(4, 4, "B", Magick::ShortPixel, blue);
    ctx.composite(blueImage, 0, 0, Magick::CopyBlueCompositeOp);
}

ctx.sample(Magick::Geometry(200, 200)); // Enlarge so we can see the results.
ctx.write("output.png");

output.png

当然,您可以完全消除这种情况,只需分配一个1d数组,构建“ RGB”栅格,然后调用Magick::Image.read即可。

size_t
 x,
 y,
 i,
 width = 4,
 height = 4;
uint16_t raster[width * height * 3];
for(y = 0, i = 0; y < height; ++y) {
    for(x = 0; x < width; ++x) {
        raster[ i++ ] = red[y][x];
        raster[ i++ ] = green[y][x];
        raster[ i++ ] = blue[y][x];
    }
}
Magick::Image ctx(4, 4, "RGB", Magick::ShortPixel, raster);

YMMV