gpt4 book ai didi

image - 去图像处理

转载 作者:IT王子 更新时间:2023-10-29 01:26:53 27 4
gpt4 key购买 nike

我需要加载图像并搜索颜色并替换它们。例如,在图像上我需要搜索所有红色像素并将它们转换为紫色。

我正在执行以下操作(img 是有效的 .png 图像):

func colorize(img image.Image) {
b := image.NewRGBA(img.Bounds())
draw.Draw(b, b.Bounds(), img, image.ZP, draw.Src)
for x := 0; x < b.Bounds().Dx(); x++ {
for y := 0; y < b.Bounds().Dy(); y++ {
log.Println(b.At(x, y).RGBA())
}
}
}

问题是 img.At().RGBA() 似乎没有返回正确的 R、G、B、A 代码?例如,我得到的数字大于 255。

那么我应该如何读取所有图像像素,同时能够知道它们的 x 和 y 位置?

最佳答案

img.At().RGBA()Color.RGBA() .引用其文档:

// RGBA returns the alpha-premultiplied red, green, blue and alpha values
// for the color. Each value ranges within [0, 0xffff], but is represented
// by a uint32 so that multiplying by a blend factor up to 0xffff will not
// overflow.
//
// An alpha-premultiplied color component c has been scaled by alpha (a),
// so has valid values 0 <= c <= a.

RGBA() 返回的组件在 0..0xffff 范围内,而不是 0..0xff,并且它们也是 alpha-预乘。

手动解码

取回 0..255 范围内的红色、绿色、蓝色分量的一种方法是向右移动 8,例如:

r, g, b, a := b.At(x, y).RGBA()
r, g, b, a = r>>8, g>>8, b>>8, a>>8
log.Println(r, g, b) // Now in range 0..255

转换为color.RGBA

另一种方法是将颜色转换为 color.RGBA这是一个结构,包含简单明了的组件:

type RGBA struct {
R, G, B, A uint8
}

由于您使用的是 image.NewRGBA()它返回 image.RGBA 类型的图像,Image.At() 方法返回的颜色将是动态类型 color.RGBA,因此您可以简单地使用 type assertion。 :

rgbacol := b.At(x, y).(color.RGBA)
log.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

通常(如果图像不是 image.RGBA 类型),Image.At() 可能是也可能不是具体类型 color.RGBA

所以在一般情况下,您需要将颜色转换为color.RGBA 类型的值。颜色模型之间的转换由 color.Model 建模,并且 image/color 包具有预定义的转换器。您需要的是 color.RGBAModelcolor.RGBAModel.Convert() 将返回一个 color.Color 值,其动态类型肯定是 color.RGBA

使用 color.RGBAModel 的示例:

var c color.Color
c = color.Gray{160}

rgbacol := color.RGBAModel.Convert(c).(color.RGBA)

fmt.Println(rgbacol.R, rgbacol.G, rgbacol.B, rgbacol.A)

输出(在 Go Playground 上尝试):

160 160 160 255

所以在你的循环中做:

rgbacol := color.RGBAModel.Convert(b.At(x, y).(color.RGBA)
// rgbacol is a struct of type color.RGBA, components are in range 0..255

注意:

上述解决方案仍然会返回 alpha 预乘组件。如果您想取消 alpha 预乘,您可以使用 color.NRGBAModel 转换器(而不是 color.RGBAModel)。

关于image - 去图像处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37635426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com