Image Golang图像颜色模型()

Image Golang图像颜色模型(),image,go,colors,Image,Go,Colors,我在自学。我决定试试电脑视觉的东西。首先我要做一个图像直方图。我试图得到颜色模型,以便知道像素的强度范围。当我打印image.ColorModel()时,它会给我一个神秘的十六进制输出: 颜色模型:&{0x492f70} 我在文件里找不到任何解释。我期望某种枚举类型的东西能够映射到颜色模型,比如,NRGBA、RGBA等等 那个十六进制是什么意思?符号和大括号是什么意思?还有,NRGBA中的“N”是什么?我找不到任何关于它的信息 那个十六进制是什么意思 正在打印的变量的内存指针地址 符号和花括

我在自学。我决定试试电脑视觉的东西。首先我要做一个图像直方图。我试图得到颜色模型,以便知道像素的强度范围。当我打印
image.ColorModel()
时,它会给我一个神秘的十六进制输出:

颜色模型:&{0x492f70}
我在文件里找不到任何解释。我期望某种枚举类型的东西能够映射到颜色模型,比如,NRGBA、RGBA等等

那个十六进制是什么意思?符号和大括号是什么意思?还有,NRGBA中的“N”是什么?我找不到任何关于它的信息

那个十六进制是什么意思

正在打印的变量的内存指针地址

符号和花括号&{…}是什么意思

参考这个

NRGBA中的“N”是什么

NRGBA表示非alpha预乘32位颜色。请参阅。

一个被声明为具有以下方法集的接口:

type Image interface {
    ColorModel() color.Model
    Bounds() Rectangle
    At(x, y int) color.Color
}
方法
ColorModel()
返回一个名为的接口,该接口声明为:

type Model interface {
    Convert(c Color) Color
}
type modelFunc struct {
    f func(Color) Color
}
由于
ColorModel
返回一个接口,因此不能使用
*
取消对它的引用。您所看到的
&{0x492f70}
是实现
color.Model
接口的底层数据结构,在本例中,它是指向地址
0x492f70
的指针。通常,如何实现
ColorModel
的基础数据并不重要(任何类型都是有效的,只要它有
Convert(c Color)Color
方法),但是如果您好奇,几个标准颜色类型的模型都是作为一个指针实现的,声明为:

type Model interface {
    Convert(c Color) Color
}
type modelFunc struct {
    f func(Color) Color
}
打印
ColorModel
时得到的是指向此结构的指针。尝试使用
fmt.Printf(“%+v\n”,img.ColorModel())
打印它,您将看到类似
和{f:0x492f70}
的输出,其中
f
表示上述结构中的字段名

在中,有几种标准颜色类型的模型,例如,
color.nrgbModel
color.GrayModel
,等等。如果要检测图像的颜色模型,可以将其与这些标准模型进行比较,例如

if img.ColorModel() == color.RGBAModel {
    //32-bit RGBA color, each R,G,B, A component requires 8-bits
} else if img.ColorModel() == color.GrayModel {
    //8-bit grayscale
}
//...

为了扩展putu的回答,将返回的颜色模型与包装的“准备好的”模型进行比较仅在使用其中一个模型时有效,否则所有比较将导致
错误
。此外,列出和比较所有可能的模型也很不方便

我们可以使用这个小技巧来找出颜色模型的一种有说服力的形式:尝试使用图像的颜色模型来转换任何颜色。具体颜色模型将所有颜色值(实现)转换为图像使用的颜色类型/实现。打印结果颜色的类型将告诉您要查找的内容

例如:

col := color.RGBA{} // This is the "any" color we convert
var img image.Image

img = &image.NRGBA{}
fmt.Printf("%T\n", img.ColorModel().Convert(col))

img = &image.Gray16{}
fmt.Printf("%T\n", img.ColorModel().Convert(col))

img = &image.NYCbCrA{}
fmt.Printf("%T\n", img.ColorModel().Convert(col))

img = &image.Paletted{}
fmt.Printf("%T\n", img.ColorModel().Convert(col))
输出(在上尝试):

现在,输出将是(在上尝试此操作):


我想这是一个内存地址,但我如何得到它所代表的颜色模型呢。我尝试使用
*
取消引用,但出现错误。您可以使用
*
取消引用。你能分享错误信息吗?当我使用
*(src.color.Model())
时,我得到:
src/github/see/histogram/histogram.go:13:src.ColorModel()的间接无效(键入color.Model)
只需做一个
*src.color.Model()
(*src.color.Model())
。谢谢你,这是一个有趣的方法,而且它更健壮。
color.Gray16