我有一个带有像素的暗淡数组,用于存储其中的图像。我正在尝试将其作为二维数组打印到文件中。

每个图像为28 * 28像素,并且数组包含60000个像素。

我对输出单个图像的数学没问题:

void makeImage(const std::string& filename,const char * insertion, const unsigned int& width, const unsigned int & height)
{
    int i = 0;
    FILE *fp = fopen(filename.c_str(), "wb"); /* b - binary mode */
    (void)fprintf(fp, "P6\n%d %d\n255\n", width, height);
    for (int x = 0; x < width; ++x)
    {
        for (int y = 0; y < height; ++y)
        {
            static unsigned char color[3];
            color[0] = *(insertion + i);  /* red */
            color[1] = *(insertion + i);  /* green */
            color[2] = *(insertion + i);  /* blue */
            (void)fwrite(color, 1, 3, fp);
            i++;
        }
    }
    (void)fclose(fp);
}


所以,如果我在哪里做:

makeimage("myfile.ppm",&myarray[0],28,28); //First image.
makeimage("myfile2.ppm",&myarray[785],28,28); //Second image. ext.


但是id希望将所有60000张照片合而为一。作为6860x6860像素的图片。

但是这样做的数学让我头疼。

最佳答案

您无法将这些图像完全适合60000个图像的正方形,但是可以进行例如600行100列的网格。 (结果图像将为16800 x2800。)

我确定您可以处理C ++实现,所以这是数学运算:

您有一系列图像:

| ---- im1 ---- ||| ---- im2 ---- | .... | ---- im60000 ---- |

您要获取合成图像:

| ---- im1 ---- ||| ---- im2 ---- | .... | ---- im600 ---- |

| --- im601 --- ||| --- im602 --- | .... | --- im1200 ---- |

...

| --im59401-- ||| --im59402-- | .... | --im60000-- |

这是一些伪代码将执行此操作。

for a in 600
  for b in 28
    for c in 100
      for d in 28
        result[100*28*(28*a + b) + 28*c + d] = arr[28*28*(100*a + c) + 28*b + d]


在这里,结果是您的大型输出图像,而arr是您的大型输入数组。

基本上,第一和第三循环负责图像的位置,第二和第四循环处理当前图像中当前像素的位置。

它不是很漂亮,但是可以。
我猜您必须考虑颜色,但是我假设您正在解析MNIST数据(60000个28x28手写数字图像),我相信它是灰度的。

祝您项目顺利。

关于c++ - 编写多级for循环有困难,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47116510/

10-12 15:54