我正在自学Go。我决定尝试一些计算机视觉的东西。首先,我要做一个图像直方图。我正在尝试获取颜色模型,因此我知道像素的强度范围。当我打印image.ColorModel()
时,它给我一个神秘的十六进制输出:
color model: &{0x492f70}
我在文档中找不到任何解释。我期待某种枚举类型的东西可以映射到颜色模型,如NRGBA,RGBA等。
十六进制是什么意思? &符号花括号&{...}
是什么意思?还有什么是NRGBA中的“N”我找不到任何关于它的东西。
答案 0 :(得分:5)
为了扩展普图的答案,将返回的颜色模型与准备好的" image
包的模型仅在使用其中一个模型时才有效,否则所有比较都将生成false
。列出并与所有可能的模型进行比较也非常不方便。
相反,为了找出颜色模型的健谈形式,我们可以使用这个小技巧:尝试使用图像的颜色模型转换任何颜色。具体的颜色模型将所有颜色值(实现)转换为图像使用的颜色类型/实现。打印生成的颜色类型将告诉您要查找的内容。
示例:
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))
输出(在Go Playground上尝试):
color.NRGBA
color.Gray16
color.NYCbCrA
<nil>
可以看出,*image.NRGBA
类型的图像使用color.NRGBA
模拟颜色,*image.Gray16
类型的图像使用color.Gray16
模型颜色等。作为最后一个例子我使用*image.Paletted
,结果为nil
,因为图片的调色板为空。
要快速修复nil
调色板,请提供初始调色板:
img = &image.Paletted{Palette: []color.Color{color.Gray16{}}}
fmt.Printf("%T\n", img.ColorModel().Convert(col))
现在输出将是(在Go Playground上尝试这个):
color.Gray16
答案 1 :(得分:3)
Image
被声明为具有以下方法集的接口:
type Image interface {
ColorModel() color.Model
Bounds() Rectangle
At(x, y int) color.Color
}
方法ColorModel()
返回名为color.Model
的接口,声明为:
type Model interface {
Convert(c Color) Color
}
由于ColorModel
返回一个界面,因此您无法使用*
取消引用它。您看到的&{0x492f70}
是实现color.Model
接口的底层数据结构,在这种情况下,它是一个指向地址0x492f70
的指针。通常,如何实现ColorModel
的基础数据并不重要(任何类型只要有Convert(c Color) Color
方法就有效),但如果你很好奇,那么几种标准颜色的模型类型被实现为指向unexported struct的指针,声明为:
type modelFunc struct {
f func(Color) Color
}
打印ColorModel
时得到的是指向此结构的指针。尝试使用fmt.Printf("%+v\n", img.ColorModel())
进行打印,您会看到一个类似&{f:0x492f70}
的输出,其中f
表示上述结构中的字段名称。
在the documentation中,有几种标准颜色类型的模型,例如color.NRGBAModel
,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
}
//...
答案 2 :(得分:0)