#jsDisabledContent { display:none; } My Account |  Register |  Help

# Lightness

Article Id: WHEBN0009220187
Reproduction Date:

 Title: Lightness Author: World Heritage Encyclopedia Language: English Subject: Collection: Publisher: World Heritage Encyclopedia Publication Date:

### Lightness

Three hues in the Munsell color model. Each color differs in value from top to bottom in equal perception steps. The right column undergoes a dramatic change in perceived color.

In colorimetry and color theory, lightness, also known as value or tone, is a representation of variation in the perception of a color or color space's brightness. It is one of the color appearance parameters of any color appearance model. Lightness is a relative term. Lightness means brightness of an area judged relative to the brightness of a similarly illuminated area that appears to be white or highly transmitting. Lightness should not be confused with brightness.[1]

Various color models have an explicit term for this property. The Munsell color model uses the term value, while the HSL color model and Lab color space use the term lightness. The HSV model uses the term value a little differently: a color with a low value is nearly black, but one with a high value is the pure, fully saturated color.

In subtractive color (i.e. paints) value changes can be achieved by adding black or white to the color. However, this also reduces saturation. Chiaroscuro and Tenebrism both take advantage of dramatic contrasts of value to heighten drama in art. Artists may also employ shading, subtle manipulation of value.

## Contents

• Relationship between lightness, value, and luminance 1
• Other psychological effects 2
• References 4

## Relationship between lightness, value, and luminance

The Munsell value has long been used as a perceptually uniform lightness scale. A question of interest is the relationship between the Munsell value scale and the relative luminance. Aware of the Weber–Fechner law, Munsell remarked "Should we use a logarithmic curve or curve of squares?"[2] Neither option turned out to be quite correct; scientists eventually converged on a roughly cube-root curve, consistent with the Stevens power law for brightness perception, reflecting the fact that lightness is proportional to the number of nerve impulses per nerve fiber per unit time.[3] The remainder of this section is a chronology of lightness approximations, leading to CIELAB.

Note: Munsell's V runs from 0 to 10, while Y typically runs from 0 to 100 (often interpreted as a percentage). Typically, the relative luminance is normalized so that the "reference white" (say, magnesium oxide) has a tristimulus value of Y=100. Since the reflectance of magnesium oxide (MgO) relative to the perfect reflecting diffuser is 97.5%, V=10 corresponds to Y=100/97.5%≈102.6 if MgO is used as the reference.[4]

Observe that the lightness is 50% for a luminance of around 18% relative to the reference white.
1920
Priest et al. provide a basic estimate of the Munsell value (with Y running from 0 to 1 in this case):[5]
V=10 \sqrt{Y}
1933
Munsell, Sloan, and Godlove launch a study on the Munsell neutral value scale, considering several proposals relating the relative luminance to the Munsell value, and suggest:[6][7]
V^2=1.4742Y-0.004743Y^2
1943
Newhall, Nickerson, and Judd prepare a report for the Optical Society of America. They suggest a quintic parabola (relating the reflectance in terms of the value):[8]
Y=1.2219V-0.23111V^2+0.23951V^3-0.021009V^4+0.0008404V^5
1943
Using Table II of the O.S.A. report, Moon and Spencer express the value in terms of the luminance:[9]
V=5 (Y/19.77)^{0.426}=1.4 Y^{0.426}
1944
Saunderson and Milner introduce a subtractive constant in the previous expression, for a better fit to the Munsell value.[10] Later, Jameson and Hurvich claim that this corrects for simultaneous contrast effects.[11][12]
V=2.357 Y^{0.343}-1.52
1955
Ladd and Pinney of Eastman Kodak are interested in the Munsell value as a perceptually uniform lightness scale for use in television. After considering one logarithmic and five power-law functions (per Stevens' power law), they relate value to reflectance by raising the reflectance to the power of 0.352:[13]
V=2.217 Y^{0.352}-1.324
Realizing this is quite close to the cube root, they simplify it to:
V=2.468 Y^{1/3}-1.636
1958
Glasser et al. define the lightness as ten times the Munsell value (so that the lightness ranges from 0 to 100):[14]
L^*=25.29 Y^{1/3} - 18.38
1964
Wyszecki simplifies this to:[15]
W^*=25Y^{1/3}-17
This formula approximates the Munsell value function for 1\% < Y < 98\% (it is not applicable for Y<1%) and is used for the CIE 1964 color space.
1976
CIELAB uses the following formula:
L^* = 116 (Y/Y_n)^{1/3}-16
where Y_n is the Y tristimulus value of a "specified white object" and is subject to the restriction Y/Y_n > 0.01. Pauli removes this restriction by computing a linear extrapolation which maps Y/Yn=0 to L*=0 and is tangent to the formula above at the point at which the linear extension takes effect. First, the transition point is determined to be Y/Y_n=(6/29)^3 \approx 0.008856, then the slope of (29/3)^3 \approx 903.3 is computed. This gives the two-part function:[16]
f(Y/Y_n)= \left\{\begin{array}{ll}\frac{841}{108}Y/Y_n + \frac{4}{29}, & Y/Y_n \le (6/29)^3 \\ \\ (Y/Y_n)^{1/3}, & Y/Y_n > (6/29)^3\end{array}\right.
The lightness is then L^*=116 f(Y/Y_n)-16.

At first glance, you might approximate the lightness function by a cube root, an approximation that is found in much of the technical literature. However, the linear segment near black is significant, and so the 116 and 16 coefficients. The best-fit pure power function has an exponent of about 0.42, far from 1/3.[17]

An approximately 18% grey card, having an exact reflectance of \left(33/58\right)^3, has a lightness value of 50. It is called "mid grey" because its lightness is midway between black and white.

## Other psychological effects

This subjective perception of luminance in a non-linear fashion is one thing that makes gamma compression of images worthwhile. Beside this phenomenon there are other effects involving perception of lightness. Chromacity can affect perceived lightness as described by the Helmholtz–Kohlrausch effect. Though the CIE L*a*b* space and relatives do not account for this effect on lightness, it may be implied in the Munsell color model. Light levels may also affect perceived chromacity, as with the Purkinje effect.

## References

-- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --

local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno

local p = {}

-- Helper functions

local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end

local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end

function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end

function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end

function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end

function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end

-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.

function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end

-- Hatnote -- -- Produces standard hatnote text. Implements the template.

function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end

function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )

end

return p-------------------------------------------------------------------------------- -- Module:Hatnote -- -- -- -- This module produces hatnote links and links to related articles. It -- -- implements the and meta-templates and includes -- -- helper functions for other Lua hatnote modules. --

local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mArguments -- lazily initialise Module:Arguments local yesno -- lazily initialise Module:Yesno

local p = {}

-- Helper functions

local function getArgs(frame) -- Fetches the arguments from the parent frame. Whitespace is trimmed and -- blanks are removed. mArguments = require('Module:Arguments') return mArguments.getArgs(frame, {parentOnly = true}) end

local function removeInitialColon(s) -- Removes the initial colon from a string, if present. return s:match('^:?(.*)') end

function p.findNamespaceId(link, removeColon) -- Finds the namespace id (namespace number) of a link or a pagename. This -- function will not work if the link is enclosed in double brackets. Colons -- are trimmed from the start of the link by default. To skip colon -- trimming, set the removeColon parameter to true. checkType('findNamespaceId', 1, link, 'string') checkType('findNamespaceId', 2, removeColon, 'boolean', true) if removeColon ~= false then link = removeInitialColon(link) end local namespace = link:match('^(.-):') if namespace then local nsTable = mw.site.namespaces[namespace] if nsTable then return nsTable.id end end return 0 end

function p.formatPages(...) -- Formats a list of pages using formatLink and returns it as an array. Nil -- values are not allowed. local pages = {...} local ret = {} for i, page in ipairs(pages) do ret[i] = p._formatLink(page) end return ret end

function p.formatPageTables(...) -- Takes a list of page/display tables and returns it as a list of -- formatted links. Nil values are not allowed. local pages = {...} local links = {} for i, t in ipairs(pages) do checkType('formatPageTables', i, t, 'table') local link = t[1] local display = t[2] links[i] = p._formatLink(link, display) end return links end

function p.makeWikitextError(msg, helpLink, addTrackingCategory) -- Formats an error message to be returned to wikitext. If -- addTrackingCategory is not false after being returned from -- Module:Yesno, and if we are not on a talk page, a tracking category -- is added. checkType('makeWikitextError', 1, msg, 'string') checkType('makeWikitextError', 2, helpLink, 'string', true) yesno = require('Module:Yesno') local title = mw.title.getCurrentTitle() -- Make the help link text. local helpText if helpLink then helpText = ' (help)' else helpText = end -- Make the category text. local category if not title.isTalkPage and yesno(addTrackingCategory) ~= false then category = 'Hatnote templates with errors' category = string.format( '%s:%s', mw.site.namespaces[14].name, category ) else category = end return string.format( '%s', msg, helpText, category ) end

-- Format link -- -- Makes a wikilink from the given link and display values. Links are escaped -- with colons if necessary, and links to sections are detected and displayed -- with " § " as a separator rather than the standard MediaWiki "#". Used in -- the template.

function p._formatLink(link, display) -- Find whether we need to use the colon trick or not. We need to use the -- colon trick for categories and files, as otherwise category links -- categorise the page and file links display the file. checkType('_formatLink', 1, link, 'string') checkType('_formatLink', 2, display, 'string', true) link = removeInitialColon(link) local namespace = p.findNamespaceId(link, false) local colon if namespace == 6 or namespace == 14 then colon = ':' else colon = end -- Find whether a faux display value has been added with the | magic -- word. if not display then local prePipe, postPipe = link:match('^(.-)|(.*)$') link = prePipe or link display = postPipe end -- Find the display value. if not display then local page, section = link:match('^(.-)#(.*)$') if page then display = page .. ' § ' .. section end end -- Assemble the link. if display then return string.format('%s', colon, link, display) else return string.format('%s%s', colon, link) end end

-- Hatnote -- -- Produces standard hatnote text. Implements the template.

function p.hatnote(frame) local args = getArgs(frame) local s = args[1] local options = {} if not s then return p.makeWikitextError( 'no text specified', 'Template:Hatnote#Errors', args.category ) end options.extraclasses = args.extraclasses options.selfref = args.selfref return p._hatnote(s, options) end

function p._hatnote(s, options) checkType('_hatnote', 1, s, 'string') checkType('_hatnote', 2, options, 'table', true) local classes = {'hatnote'} local extraclasses = options.extraclasses local selfref = options.selfref if type(extraclasses) == 'string' then classes[#classes + 1] = extraclasses end if selfref then classes[#classes + 1] = 'selfref' end return string.format( '
%s
', table.concat(classes, ' '), s )

end

return p
1. ^ [1] Brightness vs. Lightness
2. ^
3. ^
4. ^
5. ^
6. ^ Note: This paper contains a historical survey stretching to 1760.
7. ^
8. ^
9. ^
10. ^
11. ^
12. ^
13. ^
14. ^
15. ^ Note: The asterisks are not used in the paper.
16. ^
17. ^
This article was sourced from Creative Commons Attribution-ShareAlike License; additional terms may apply. World Heritage Encyclopedia content is assembled from numerous content providers, Open Access Publishing, and in compliance with The Fair Access to Science and Technology Research Act (FASTR), Wikimedia Foundation, Inc., Public Library of Science, The Encyclopedia of Life, Open Book Publishers (OBP), PubMed, U.S. National Library of Medicine, National Center for Biotechnology Information, U.S. National Library of Medicine, National Institutes of Health (NIH), U.S. Department of Health & Human Services, and USA.gov, which sources content from all federal, state, local, tribal, and territorial government publication portals (.gov, .mil, .edu). Funding for USA.gov and content contributors is made possible from the U.S. Congress, E-Government Act of 2002.

Crowd sourced content that is contributed to World Heritage Encyclopedia is peer reviewed and edited by our editorial staff to ensure quality scholarly research articles.