我有一个带有像素的暗淡数组,用于存储其中的图像。我正在尝试将其作为二维数组打印到文件中。
每个图像为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/