我一直在尝试将许多MNIST数据库绘制到一个图像文件,在我的第一次尝试中,生成的图像似乎偏移了,如下所示:
我知道训练文件包含60,000张图像,每张图像为28 x 28像素大,在文件中被表示为28 x 28 x 60,000 uint8的数组,其长度应为47040000。
但是,当打印文件的长度时,它的长度为47040016,这导致图像移位的额外16个数字。
使用的代码如下,const imgNum由我要打印的图像和图像的长度定义。读取图像文件时,我真的看不到有什么奇怪的事情。
package main
import (
"image"
"image/color"
"image/png"
"io/ioutil"
"os"
)
const (
imgSideLength = 28
imgSize = imgSideLength * imgSideLength
imgNum = 499 * imgSize
)
var images []uint8
func main() {
images, err := ioutil.ReadFile("train-images")
check(err)
canvas := image.NewRGBA(image.Rect(0, 0, imgSideLength, imgSideLength))
pixelIndex := imgNum
for i := 0; i < imgSideLength; i++ {
for j := 0; j < imgSideLength; j++ {
currPixel := images[pixelIndex]
pixelIndex++
pixelColor := color.RGBA{currPixel, currPixel, currPixel, 255}
canvas.Set(j, i, pixelColor)
}
}
numFile, err := os.Create("number.png")
check(err)
defer numFile.Close()
png.Encode(numFile, canvas)
}
func check(e error) {
if e != nil {
panic(e)
}
}
知道这16个像素是导致图像偏移的像素,所以我决定修改imgNum:
imgNum = 499 * imgSize + 16
进行此更改后,图像将绘制得很好。
但是我仍然想知道为什么在不应该有的地方还有16个数字?
答案 0 :(得分:2)
查看their web site,您可以看到文件的数据格式为:
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
这意味着前16个字节是4个32位整数,即16个字节的标头信息。