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