【问题标题】:Golang image ColorModel()Golang 图像 ColorModel()
【发布时间】:2017-07-21 00:06:38
【问题描述】:

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

这个十六进制是什么意思?与号大括号&{...} 是什么意思?另外,NRGBA 中的“N”是什么,我找不到任何关于它的信息。

【问题讨论】:

    标签: image go colors


    【解决方案1】:

    为了扩展 putu 的答案,将返回的颜色模型与 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
    

    【讨论】:

    • 谢谢你,有趣的方法,是的,它更健壮。
    【解决方案2】:

    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 返回一个接口,您不能使用* 取消引用它。你看到的&amp;{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()) 打印它,您会看到类似&amp;{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
    }
    //...
    

    【讨论】:

      【解决方案3】:

      这个十六进制是什么意思?

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

      和号大括号 &{...} 是什么意思?

      参考这个SO Post

      NRGBA 中的“N”是什么

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

      【讨论】:

      • 我认为这是一个内存地址,但我如何获得它所代表的颜色模型。我尝试使用 * 取消引用,但这给了我一个错误。
      • 您可以使用* 取消引用它。可以分享一下错误信息吗?
      • 当我使用*(src.color.Model()) 我得到:src/github/see/histogram/histogram.go:13: invalid indirect of src.ColorModel() (type color.Model)
      • 只做*src.color.Model()(*src.color.Model())之一。
      猜你喜欢
      • 2017-08-11
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      相关资源
      最近更新 更多