Golang图像ColorModel()

时间:2017-07-21 00:06:38

标签: image go colors

我正在自学Go。我决定尝试一些计算机视觉的东西。首先,我要做一个图像直方图。我正在尝试获取颜色模型,因此我知道像素的强度范围。当我打印image.ColorModel()时,它给我一个神秘的十六进制输出: color model: &{0x492f70} 我在文档中找不到任何解释。我期待某种枚举类型的东西可以映射到颜色模型,如NRGBA,RGBA等。

十六进制是什么意思? &符号花括号&{...}是什么意思?还有什么是NRGBA中的“N”我找不到任何关于它的东西。

3 个答案:

答案 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.NRGBAModelcolor.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)

  

十六进制是什么意思?

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

  

&符号括号&amp; {...}是什么意思?

请参阅此SO Post

  

什么是&#34; N&#34;在NRGBA

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