将图片数据转换为张量(Go并发处理)

        在Go语言中,将图片数据转换成Tensor通常需要依赖一些外部库,编写一个简单的程序,该程序批量同时处理图片,将其转换为对应的浮点数张量。 

         假设图片是单通道(灰度图)或者三通道(彩色图),我们将图片的每个像素值归一化到0到1之间,然后创建一个gorgonia张量。

        注意sync.WaitGroup和sync.Mutex的使用

package main

import (
	"fmt"
	"image"
	"image/png"
	"os"
	"sync"

	"gorgonia.org/gorgonia"
)

func processImage(imagePath string, tensor *gorgonia.Tensor, wg *sync.WaitGroup, lock *sync.Mutex) error {
	img, err := os.Open(imagePath)
	if err != nil {
		return fmt.Errorf("error opening image file: %v", err)
	}
	defer img.Close()

	imgBounds := img.Bounds()
	img = image.NewRGBA(imgBounds)
	err = png.Decode(img, img)
	if err != nil {
		return fmt.Errorf("error decoding image: %v", err)
	}

	lock.Lock()
	defer lock.Unlock()

	for y := imgBounds.Min.Y; y < imgBounds.Max.Y; y++ {
		for x := imgBounds.Min.X; x < imgBounds.Max.X; x++ {
			r, g, b, _ := img.At(x, y).RGBA()
			tensor.SetWithShape(y, x, 0, float32(r)/255.0) // 设置红色通道
			tensor.SetWithShape(y, x, 1, float32(g)/255.0) // 设置绿色通道
			tensor.SetWithShape(y, x, 2, float32(b)/255.0) // 设置蓝色通道
		}
	}

	return nil // 没有错误发生
}

func main() {
	var wg sync.WaitGroup
	var lock sync.Mutex
	imagePaths := []string{
		"path/xcl/image1.png",
		"path/xcl/image2.png",
		"path/xcl/image3.png",
	}

	// 假设所有图片大小和通道数相同
	img, err := os.Open(imagePaths[0])
	if err != nil {
		panic(err)
	}
	defer img.Close()

	imgBounds := img.Bounds()
	tensorShape := gorgonia.WithShape(imgBounds.Dy(), imgBounds.Dx(), 3) // 假设RGB图片
	tensor := gorgonia.NewTensor(tensorShape)

	for _, imagePath := range imagePaths {
		wg.Add(1)
		go func(imagePath string, tensor *gorgonia.Tensor, wg *sync.WaitGroup, lock *sync.Mutex) {
			defer wg.Done()
			err := processImage(imagePath, tensor, wg, &lock)
			if err != nil {
				fmt.Printf("Error processing image %s: %v\n", imagePath, err)
			}
		}(imagePath, tensor, &wg, &lock)
	}

	// 等待所有goroutines完成
	wg.Wait()

	// 在这里检查是否有任何错误发生
	for _, imagePath := range imagePaths {
		fmt.Printf("Processed image: %s\n", imagePath)
	}
	fmt.Println(tensor)
}

   请注意,这个例子假设图片是PNG格式的,并且是RGB彩色图片。

如果实际中,图片是其他格式或颜色模式,那需要另外再调整代码。

相关推荐

  1. 图片数据转换Go并发处理

    2024-04-15 10:16:04       19 阅读
  2. debian pdf 转换jpg图片

    2024-04-15 10:16:04       11 阅读
  3. pytorch和numpy数组相互转换

    2024-04-15 10:16:04       34 阅读
  4. 字符串转换Python数据类型

    2024-04-15 10:16:04       10 阅读
  5. PHPHTML标签转化图片

    2024-04-15 10:16:04       18 阅读
  6. pdf转化图片的方法

    2024-04-15 10:16:04       10 阅读
  7. 使用python图片转为一个PDF

    2024-04-15 10:16:04       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-15 10:16:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-15 10:16:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-15 10:16:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-15 10:16:04       18 阅读

热门阅读

  1. go第三方库go.uber.org介绍

    2024-04-15 10:16:04       18 阅读
  2. 前后端AES对称加密 前端TS 后端Go

    2024-04-15 10:16:04       27 阅读
  3. 文件上传下载

    2024-04-15 10:16:04       14 阅读
  4. obs二开_播放媒体源

    2024-04-15 10:16:04       13 阅读
  5. kafka---broker相关配置

    2024-04-15 10:16:04       12 阅读
  6. WPF中Binding的原理和应用

    2024-04-15 10:16:04       14 阅读
  7. data_process11

    2024-04-15 10:16:04       12 阅读
  8. 解决 assemble 长时间卡死并失败问题

    2024-04-15 10:16:04       14 阅读
  9. 设计模式-单一职责原则

    2024-04-15 10:16:04       16 阅读
  10. 基于springboot的大学生入学审核系统源码数据库

    2024-04-15 10:16:04       17 阅读