go语言实现对图像数据集mnist的操作

package main
import (
	"encoding/binary"
	"fmt"
	"image"
	"image/color"
	"image/png"
	"io"
	"log"
	"os"
)
 
type RawImage []byte
 
 
// 输入文件句柄
// 输出所有图片切片数组
func readImageFile(r io.Reader) ([]RawImage, error)  {
    
    
 
	var magic int32
 
	if err := binary.Read(r, binary.BigEndian, &magic); nil != err{
    
    
		return nil , err
	}
 
	if 0x0803 != magic{
    
    
		return nil, os.ErrInvalid
	}
 
 	var picNum int32
	if err := binary.Read(r, binary.BigEndian, &picNum); nil != err{
    
    
		return nil, err
	}
 
	var width, heigth int32
 
	if err := binary.Read(r, binary.BigEndian, &width); nil != err{
    
    
		return nil, err
	}
 
 
	if err := binary.Read(r, binary.BigEndian, &heigth); nil != err{
    
    
		return nil, err
	}
 
	imags := make([]RawImage, picNum)
 
	for i := 0; i < int(picNum); i++ {
    
    
 
		imags[i] = make(RawImage, width * heigth)
 
		fLen, err := io.ReadFull(r, imags[i])
 
		if nil != err{
    
    
			return nil, err
		}
 
		if fLen != int(width * heigth) {
    
    
			return nil, os.ErrInvalid
		}
 
	}
 
	return imags, nil
 
 
}
 
 
 
func main()  {
    
    
 
	fp, _ := os.Open("C:\\Users\\wg\\go\\src\\学习go语言\\fxsjy-gonn-master\\example_mnist\\train-images-idx3-ubyte")//使用了绝对路径
	if fp==nil{
    
    
		fmt.Println("打开文件失败")
	}
 
	imgs, err := readImageFile(fp)
 
	if nil != err{
    
    
		log.Fatal(err)
	}
 
	fmt.Println(len(imgs))
 
	// 使用GO生成图片
 
 
	imCols := 28
	imRows := 28
 
	rect := image.Rect(0, 0, imCols, imRows)
 
	rgba := image.NewNRGBA(rect)
 
	//
	for dy := 0; dy < imCols; dy++{
    
    
		for dx := 0; dx < imRows; dx++{
    
    
			rgba.Set(dy, dx, color.Gray{
    
    imgs[2][dy + dx * imRows]})//这里指定不同的图像
		}
	}
 
	fIm, err := os.Create("333.png")
	fmt.Println("保存成功")
 
	if nil != err{
    
    
		log.Fatal(err)
	}
 
	err = png.Encode(fIm, rgba)
 
	if nil != err{
    
    
		log.Fatal(err)
	}
 
 
}

猜你喜欢

转载自blog.csdn.net/zhuiyunzhugang/article/details/121209614