【问题标题】:find the colour name from a hexadecimal colour code从十六进制颜色代码中查找颜色名称
【发布时间】:2011-01-28 01:01:02
【问题描述】:

我想从十六进制颜色代码中找到颜色的名称。当我得到一个十六进制颜色代码时,我想找到最匹配的颜色名称。例如代码#c06040,如何判断它是棕色、蓝色还是黄色的阴影?这样我就可以在没有人工干预的情况下找到图像中物体的颜色。

颜色深浅的​​十六进制代码之间有什么关系吗? 如果有,请提供一些示例代码。

【问题讨论】:

    标签: python image-processing


    【解决方案1】:

    Wikipedia page for web colors 列出了很多,w3schools 和诱人命名的html-color-names.com 也是如此。 :-) 而this guy 有一个关于颜色的非常详尽的页面,特别是计算机和网络上的颜色。您可以访问它们,搜索您的颜色代码,然后查看它是否在列表中(如果没有,请查找接近的)。

    编辑我错过了 Python 标记。如果您想从代码中执行此操作,则上述内容可能不是 100% 有用。您可以根据来自类似网站的信息构建一个相当不错的关联查找,但即使颜色名称有些主观,似乎也有一种很好的算法方法。

    【讨论】:

      【解决方案2】:

      This page on Wikipedia 提供了从名称到十六进制代码的查找示例。在另一个方向查找将相当容易。代码和名称之间是否存在适合您的关系取决于您。您可能还会找到其他颜色名称代码表。

      【讨论】:

        【解决方案3】:

        十六进制网页颜色值只是 RGB 的一种形式。将您的 RGB 值转换为HSL,然后将色调空间划分为不同的颜色。

        例如,大约 0-19 的 Hue 值将是“红色”、20-39 “橙色”、40-59 “黄色”等(这些数字并不准确,我只是快速浏览了一下维基百科页面上的色相图。)

        要对颜色名称进行更复杂的分析,也可以使用亮度值。例如,“棕色”只是一种较深的黄色。

        【讨论】:

        • +1 -- 前段时间我曾接触过这个,但连首字母缩写词都不记得了。 :-)
        【解决方案4】:

        您可以将十六进制代码的dict 构建为键,并将人类可读的颜色名称构建为值。

        这是一个启发式/模糊函数,用于猜测颜色可能是什么样子;)

        colorof = {'f0f8ff':"Alice Blue",
                   'faebd7':"Antique White",
                   '000000':"Black"}
        
        def get_color_name(hx):
            # if color is found in dict
            if colorof.has_key(hx):return colorof[hx]
        
            # else return its closest available color
            m = 16777215
            k = '000000'
            for key in colorof.keys():
                a = int(hx[:2],16)-int(key[:2],16)
                b = int(hx[2:4],16)-int(key[2:4],16)
                c = int(hx[4:],16)-int(key[4:],16)
        
                v = a*a+b*b+c*c # simple measure for distance between colors
        
                # v = (r1 - r2)^2 + (g1 - g2)^2 + (b1 - b2)^2
        
                if v <= m:
                    m = v
                    k = key
        
            return colorof[k]
        
        print get_color_name('f0f8ff') # found in dict
        print get_color_name('faeb11') # closest to Antique white
        

        【讨论】:

        • 这将是一个大字典。 {'000000': 'black', '000001': 'still pitch black, with a hint of blue blackness', '000002': 'nope, still rather black', ...}
        • +1 是的,它将有 16^6 个键,但我们可以使用大约 100 个键和一些颜色接近度的度量。请参阅更新的答案。谢谢。
        • @TMC:有什么问题? 16^6 在 Python 的树林里只有 22 个 :-)
        • 距离测量有问题00ffff和ffff00根据它会是同一个颜色!但是查看 http://en.wikipedia.org/wiki/X11_color_names 应该可以正常工作
        • 你应该使用不同的颜色距离函数,称为delta_e。它在 colormath 库中。
        【解决方案5】:

        有一个与 Python 源代码一起分发的名为 pynche 的程序可以做到这一点

        您需要的功能在ColorDB.py中的方法ColorDB.nearest()中

        来自 Python/Tools/README

        Introduction
        
            Pynche is a color editor based largely on a similar program that I
            originally wrote back in 1987 for the Sunview window system.  That
            editor was called ICE, the Interactive Color Editor.  I'd always
            wanted to port this program to X but didn't feel like hacking X
            and C code to do it.  Fast forward many years, to where Python +
            Tkinter provides such a nice programming environment, with enough
            power, that I finally buckled down and re-implemented it.  I
            changed the name because these days, too many other systems have
            the acronym `ICE'.
        
            Pynche should work with any variant of Python after 1.5.2
            (e.g. 2.0.1 and 2.1.1), using Tk 8.0.x.  It's been tested on
            Solaris 2.6, Windows NT 4, and various Linux distros.  You'll want
            to be sure to have at least Tk 8.0.3 for Windows.  Also, Pynche is
            very colormap intensive, so it doesn't work very well on 8-bit
            graphics cards; 24bit+ graphics cards are so cheap these days,
            I'll probably never "fix" that.
        
            Pynche must find a text database of colors names in order to
            provide `nearest' color matching.  Pynche is distributed with an
            rgb.txt file from the X11R6.4 distribution for this reason, along
            with other "Web related" database (see below).  You can use a
            different file with the -d option.  The file xlicense.txt contains
            the license only for rgb.txt and both files are in the X/
            subdirectory.
        
            Pynche is pronounced: Pin'-chee
        
        
        Running Standalone
        
            On Unix, start it by running the `pynche' script.  On Windows, run
            pynche.pyw to inhibit the console window.  When run from the
            command line, the following options are recognized:
        
            --database file
            -d file
                Alternate location of the color database file.  Without this
                option, the first valid file found will be used (see below).
        
            --initfile file
            -i file
                Alternate location of the persistent initialization file.  See 
                the section on Persistency below.
        
            --ignore
            -X
                Ignore the persistent initialization file when starting up.
                Pynche will still write the current option settings to the
                persistent init file when it quits.
        
            --help
            -h
                Print the help message.
        
            initialcolor
                a Tk color name or #rrggbb color spec to be used as the
                initially selected color.  This overrides any color saved in
                the persistent init file.  Since `#' needs to be escaped in
                many shells, it is optional in the spec (e.g. #45dd1f is the
                same as 45dd1f).
        
        
        Running as a Modal Dialog
        
            Pynche can be run as a modal dialog, inside another application,
            say as a general color chooser.  In fact, Grail 0.6 uses Pynche
            and a future version of IDLE may as well.  Pynche supports the API
            implemented by the Tkinter standard tkColorChooser module, with a
            few changes as described below.  By importing pyColorChooser from
            the Pynche package, you can run
        
                pyColorChooser.askcolor()
        
            which will popup Pynche as a modal dialog, and return the selected 
            color.
        
            There are some UI differences when running as a modal
            vs. standalone.  When running as a modal, there is no "Quit" menu
            item under the "File" menu.  Instead there are "Okay" and "Cancel"
            buttons.
        
            When "Okay" is hit, askcolor() returns the tuple
        
                ((r, g, b), "name")
        
            where r, g, and b are red, green, and blue color values
            respectively (in the range 0 to 255).  "name" will be a color name
            from the color database if there is an exact match, otherwise it
            will be an X11 color spec of the form "#rrggbb".  Note that this
            is different than tkColorChooser, which doesn't know anything
            about color names.
        
            askcolor() supports the following optional keyword arguments:
        
                color
                    the color to set as the initial selected color
        
                master[*]
                    the master window to use as the parent of the modal
                    dialog.  Without this argument, pyColorChooser will create 
                    its own Tkinter.Tk instance as the master.  This may not
                    be what you want.
        
                databasefile
                    similar to the --database option, the value must be a
                    file name
        
                initfile[*]
                    similar to the --initfile option, the value must be a
                    file name
        
                ignore[*]
                    similar to the --ignore flag, the value is a boolean
        
                wantspec
                    When this is true, the "name" field in the return tuple
                    will always be a color spec of the form "#rrggbb".  It
                    will not return a color name even if there is a match;
                    this is so pyColorChooser can exactly match the API of
                    tkColorChooser.
        
                [*] these arguments must be specified the first time
                askcolor() is used and cannot be changed on subsequent calls.
        
        
        The Colorstrip Window
        
            The top part of the main Pynche window contains the "variation
            strips".  Each strip contains a number of "color chips".  The
            strips always indicate the currently selected color by a highlight
            rectangle around the selected color chip, with an arrow pointing
            to the chip.  Each arrow has an associated number giving you the
            color value along the variation's axis.  Each variation strip
            shows you the colors that are reachable from the selected color by
            varying just one axis of the color solid.
        
            For example, when the selected color is (in Red/Green/Blue
            notation) 127/127/127, the Red Variations strip shows you every
            color in the range 0/127/127 to 255/127/127.  Similarly for the
            green and blue axes.  You can select any color by clicking on its
            chip.  This will update the highlight rectangle and the arrow, as
            well as other displays in Pynche.
        
            Click on "Update while dragging" if you want Pynche to update the
            selected color while you drag along any variation strip (this will
            be a bit slower).  Click on "Hexadecimal" to display the arrow
            numbers in hex.
        
            There are also two shortcut buttons in this window, which
            auto-select Black (0/0/0) and White (255/255/255).
        
        
        The Proof Window
        
            In the lower left corner of the main window you see two larger
            color chips.  The Selected chip shows you a larger version of the
            color selected in the variation strips, along with its X11 color
            specification.  The Nearest chip shows you the closest color in
            the X11 database to the selected color, giving its X11 color
            specification, and below that, its X11 color name.  When the
            Selected chip color exactly matches the Nearest chip color, you
            will see the color name appear below the color specification for
            the Selected chip.
        
            Clicking on the Nearest color chip selects that color.  Color
            distance is calculated in the 3D space of the RGB color solid and
            if more than one color name is the same distance from the selected
            color, the first one found will be chosen.
        
            Note that there may be more than one X11 color name for the same
            RGB value.  In that case, the first one found in the text database
            is designated the "primary" name, and this is shown under the
            Nearest chip.  The other names are "aliases" and they are visible
            in the Color List Window (see below).
        
            Both the color specifications and color names are selectable for
            copying and pasting into another window.
        
        
        The Type-in Window
        
            At the lower right of the main window are three entry fields.
            Here you can type numeric values for any of the three color axes.
            Legal values are between 0 and 255, and these fields do not allow
            you to enter illegal values.  You must hit Enter or Tab to select
            the new color.
        
            Click on "Update while typing" if you want Pynche to select the
            color on every keystroke (well, every one that produces a legal
            value!)  Click on "Hexadecimal" to display and enter color values
            in hex.
        
        
        Other Views
        
            There are three secondary windows which are not displayed by
            default.  You can bring these up via the "View" menu on the main
            Pynche window.
        
        
        The Text Window
        
            The "Text Window" allows you to see what effects various colors
            have on the standard Tk text widget elements.  In the upper part
            of the window is a plain Tk text widget and here you can edit the
            text, select a region of text, etc.  Below this is a button "Track
            color changes".  When this is turned on, any colors selected in
            the other windows will change the text widget element specified in
            the radio buttons below.  When this is turned off, text widget
            elements are not affected by color selection.
        
            You can choose which element gets changed by color selection by
            clicking on one of the radio buttons in the bottom part of this
            window.  Text foreground and background affect the text in the
            upper part of the window.  Selection foreground and background
            affect the colors of the primary selection which is what you see
            when you click the middle button (depending on window system) and
            drag it through some text.
        
            The Insertion is the insertion cursor in the text window, where
            new text will be inserted as you type.  The insertion cursor only
            has a background.
        
        
        The Color List Window
        
            The "Color List" window shows every named color in the color name
            database (this window may take a while to come up).  In the upper
            part of the window you see a scrolling list of all the color names
            in the database, in alphabetical order.  Click on any color to
            select it.  In the bottom part of the window is displayed any
            aliases for the selected color (those color names that have the
            same RGB value, but were found later in the text database).  For
            example, find the color "Black" and you'll see that its aliases
            are "gray0" and "grey0".
        
            If the color has no aliases you'll see "<no aliases>" here.  If you
            just want to see if a color has an alias, and do not want to select a
            color when you click on it, turn off "Update on Click".
        
            Note that the color list is always updated when a color is selected
            from the main window.  There's no way to turn this feature off.  If
            the selected color has no matching color name you'll see
            "<no matching color>" in the Aliases window.
        
        
        The Details Window
        
            The "Details" window gives you more control over color selection
            than just clicking on a color chip in the main window.  The row of
            buttons along the top apply the specified increment and decrement
            amounts to the selected color.  These delta amounts are applied to
            the variation strips specified by the check boxes labeled "Move
            Sliders".  Thus if just Red and Green are selected, hitting -10
            will subtract 10 from the color value along the red and green
            variation only.  Note the message under the checkboxes; this
            indicates the primary color level being changed when more than one
            slider is tied together.  For example, if Red and Green are
            selected, you will be changing the Yellow level of the selected
            color.
        
            The "At Boundary" behavior determines what happens when any color
            variation hits either the lower or upper boundaries (0 or 255) as
            a result of clicking on the top row buttons:
        
            Stop
                When the increment or decrement would send any of the tied
                variations out of bounds, the entire delta is discarded.
        
            Wrap Around
                When the increment or decrement would send any of the tied
                variations out of bounds, the out of bounds value is wrapped
                around to the other side.  Thus if red were at 238 and +25
                were clicked, red would have the value 7.
        
            Preserve Distance
                When the increment or decrement would send any of the tied
                variations out of bounds, all tied variations are wrapped as
                one, so as to preserve the distance between them.  Thus if
                green and blue were tied, and green was at 238 while blue was
                at 223, and +25 were clicked, green would be at 15 and blue
                would be at 0.
        
            Squash
                When the increment or decrement would send any of the tied
                variations out of bounds, the out of bounds variation is set
                to the ceiling of 255 or floor of 0, as appropriate.  In this
                way, all tied variations are squashed to one edge or the
                other.
        
            The top row buttons have the following keyboard accelerators:
        
            -25 == Shift Left Arrow
            -10 == Control Left Arrow
             -1 == Left Arrow
             +1 == Right Arrow
            +10 == Control Right Arrow
            +25 == Shift Right Arrow
        
        
        Keyboard Accelerators
        
            Alt-w in any secondary window dismisses the window.  In the main
            window it exits Pynche (except when running as a modal).
        
            Alt-q in any window exits Pynche (except when running as a modal).
        
        
        Persistency
        
            Pynche remembers various settings of options and colors between
            invocations, storing these values in a `persistent initialization
            file'.  The actual location of this file is specified by the
            --initfile option (see above), and defaults to ~/.pynche.
        
            When Pynche exits, it saves these values in the init file, and
            re-reads them when it starts up.  There is no locking on this
            file, so if you run multiple instances of Pynche at a time, you
            may clobber the init file.
        
            The actual options stored include
        
            - the currently selected color
        
            - all settings of checkbox and radio button options in all windows
        
            - the contents of the text window, the current text selection and
              insertion point, and all current text widget element color
              settings.
        
            - the name of the color database file (but not its contents)
        
            You can inhibit Pynche from reading the init file by supplying the
            --ignore option on the command line.  However, you cannot suppress
            the storing of the settings in the init file on Pynche exit.  If
            you really want to do this, use /dev/null as the init file, using
            --initfile.
        
        
        Color Name Database Files
        
            Pynche uses a color name database file to calculate the nearest
            color to the selected color, and to display in the Color List
            view.  Several files are distributed with Pynche, described
            below.  By default, the X11 color name database file is selected.
            Other files:
        
            html40colors.txt -- the HTML 4.0 guaranteed color names
        
            websafe.txt -- the 216 "Web-safe" colors that Netscape and MSIE
            guarantee will not be dithered.  These are specified in #rrggbb
            format for both values and names
        
            webcolors.txt -- The 140 color names that Tim Peters and his
            sister say NS and MSIE both understand (with some controversy over 
            AliceBlue).
        
            namedcolors.txt -- an alternative set of Netscape colors.
        
            You can switch between files by choosing "Load palette..." from
            the "File" menu.  This brings up a standard Tk file dialog.
            Choose the file you want and then click "Ok".  If Pynche
            understands the format in this file, it will load the database and 
            update the appropriate windows.  If not, it will bring up an error 
            dialog.
        
        
        To Do
        
            Here's a brief list of things I want to do (some mythical day):
        
            - Better support for resizing the top level windows
        
            - More output views, e.g. color solids
        
            - Have the notion of a `last color selected'; this may require a
              new output view
        
            - Support setting the font in the text view
        
            - Support distutils setup.py for installation
        
            I'm open to suggestions!
        
        
        
        
        Local Variables:
        indent-tabs-mode: nil
        End:
        

        【讨论】:

          【解决方案6】:

          这是我写的一个小例子,它使用皮尔逊系数来比较两种颜色,并从字典中选择最相似的颜色。这个解决方案可能不是最有效的,但结果应该是相当不错的:

          import re
          re_color = re.compile('#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})')
          from math import sqrt
          
          def color_to_rgb(color):
              return tuple(int(x, 16) / 255.0 for x in re_color.match(color).groups())
          
          def similarity(color1, color2):
              """Computes the pearson correlation coefficient for two colors. The result
              will be between 1.0 (very similar) and -1.0 (no similarity)."""
              c1 = color_to_rgb(color1)
              c2 = color_to_rgb(color2)
          
              s1 = sum(c1)
              s2 = sum(c2)
              sp1 = sum(map(lambda c: pow(c, 2), c1))
              sp2 = sum(map(lambda c: pow(c, 2), c2))
              sp = sum(map(lambda x: x[0] * x[1], zip(c1, c2)))
          
              return (sp - (s1 * s2 / 3.0)) / sqrt((sp1 - pow(s1, 2) / 3.0) * (sp2 - pow(s2, 2) / 3.0))
          
          color_names = {
              '#ff0000': 'red',
              '#00ff00': 'green',
              '#0000ff': 'blue'
              # add more color definitions here
          }
          
          def find_name(color):
              sim = [(similarity(color, c), name) for c, name in color_names.items()]
              return max(sim, key=lambda x: x[0])[1]
          
          print find_name('#cc0000') # returns "red"
          

          【讨论】:

          • 我添加了许多颜色,但您的代码除了灰色变体(例如 '#000000': 'black', '#696969': 'dim gray', '#808080': 'gray '等)
          • 您能解释一下皮尔逊系数在这种情况下是如何衡量相似度的吗?
          【解决方案7】:

          你的代码很珍贵@tux21b,但它失败了更多的颜色名称和非真正接近的网络颜色值。 它在此行上因除以零错误而崩溃:

          return (sp - (s1 * s2 / 3.0)) / sqrt((sp1 - pow(s1, 2) / 3.0) * (sp2 - pow(s2, 2) / 3.0))
          

          我不是一个好的数学家,但我在想,如果 similarity 函数返回一个从 -1(不相似)到 +1(精确颜色)的值,那么如果除由零发生,它应该返回 0 ? 所以我已经像这样修复了你的代码:

                  try:
                      computed = (sp - (s1 * s2 / 3.0)) / sqrt((sp1 - pow(s1, 2) / 3.0) * (sp2 - pow(s2, 2) / 3.0))
                  except:
                      computed = 0
              
                  return computed
          

          然后,它运行良好并返回良好的逼近值,即使使用更大的一组预定义颜色,如下所示:

          color_names = {
              '#000000': 'black',
              '#ffffff': 'white',
              '#808080': 'dark gray',
              '#b0b0b0': 'light gray',
              '#ff0000': 'red',
              '#800000': 'dark red',
              '#00ff00': 'green',
              '#008000': 'darkgreen',
              '#0000ff': 'blue',
              '#000080': 'dark blue',
              '#ffff00': 'yellow',
              '#808000': 'olive',
              '#00ffff': 'cyan',
              '#ff00ff': 'magenta',
              '#800080': 'purple'
              }
          

          【讨论】:

          • 只适合任何想尝试的人。代码仍然不起作用。将红色放在第一行并搜索黑色,它将返回红色。 print(dc.find_name('#cc0000')) # 返回“红色” print(dc.find_name('#000000')) -> 返回红色 print(dc.find_name('#ffffff')) -> 返回红色
          • 所有三个值在 r、g、b 中都相同的所有颜色都会出现此问题。 000000, ffffff, 808080, ... 因为相似度函数以及 numpy 和其他实现必须除以零。
          猜你喜欢
          • 1970-01-01
          • 2015-04-12
          • 1970-01-01
          • 2011-10-02
          • 1970-01-01
          • 2021-11-26
          • 2017-05-03
          • 1970-01-01
          相关资源
          最近更新 更多