big*_*pat 11 python python-imaging-library
根据https://pillow.readthedocs.io/en/3.1.x/handbook/concepts.html#concept-modes,
Mar*_*ell 27
通常,图像是RGB,这意味着它们有3个通道,一个用于红色,一个用于绿色,一个用于蓝色.这通常意味着每个像素需要3个字节的存储空间,一个用于红色,一个用于绿色,一个用于蓝色.
如果你有一个P模式图像,这意味着它是palettised.这意味着它有一个最多256种不同颜色的调色板,而不是为每个像素存储R,G和B的3个字节,而是存储1个字节,它是调色板的索引.这赋予了优点和缺点.优点是您的图像需要内存和磁盘空间的1/3.缺点是它只能代表256种独特的颜色 - 所以你可能会得到条纹或人工制品.
如果您有L模式图像,则表示它是单通道图像 - 通常被解释为灰度.L表示只存储Luminance.它非常紧凑,但只存储灰度,而不是颜色.
您可以使用该convert(mode)功能在它们之间进行转换,例如转到RGB模式,使用:
image.convert('RGB')
Run Code Online (Sandbox Code Playgroud)
我使用"通常"这个词相当多!为什么?因为你可以做异常的事情!
您可以以RGB格式存储灰色图像.你所做的只是使红色分量等于绿色分量等于蓝色分量(R = G = B),它将显示为灰色但存储在一个低效的RGB格式中,需要3倍的空间.
您可以以P格式存储灰色图像,只需确保所有调色板条目都具有R = G = B.
这是踢球者...如果你想要并期望一个RGB图像,你应该在开场时转换为RGB:
im = Image.open("image.jpg").convert('RGB')
Run Code Online (Sandbox Code Playgroud)
这样你就不会遇到GIF文件(总是被palettised)的问题,也不会有PNG文件的问题,这些文件可以是pareeised,可以是灰度或RGB.你通常不会遇到JPEG图像的问题,因为它们几乎总是RGB.
这是一个展示的例子.从这个红蓝色渐变图像开始:
让我们IPython来看看RGB空间.首先,看看红色频道:
In [21]: im = Image.open('a.png').convert('RGB')
In [22]: np.array(im.getchannel(0))
Out[22]:
array([[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[254, 254, 254, ..., 254, 254, 254],
...,
[ 1, 1, 1, ..., 1, 1, 1],
[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
注意它顶部有255,因为它是红色,底部是0,因为那里没有红色.
现在让我们看一下绿色通道,到处都是0,因为没有绿色.
In [23]: np.array(im.getchannel(1))
Out[23]:
array([[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
...,
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0],
[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
最后,让我们来看看蓝色频道.它在顶部为0,图像为纯红色,底部为255,图像为纯蓝色.
In [24]: np.array(im.getchannel(2))
Out[24]:
array([[ 0, 0, 0, ..., 0, 0, 0],
[ 0, 0, 0, ..., 0, 0, 0],
[ 1, 1, 1, ..., 1, 1, 1],
...,
[254, 254, 254, ..., 254, 254, 254],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
现在让我们在调色板模式下查看相同的图像.
# Convert to palette mode
im = Image.open('a.png').convert('P')
# Extract the palette and reshape as 256 entries of 3 RGB bytes each
In [27]: np.array(im.getpalette()).reshape(256,3)
Out[27]:
array([[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 0, 0, 0],
[ 51, 0, 0],
[102, 0, 0],
[153, 0, 0],
[204, 0, 0],
[255, 0, 0], <--- entry 15 = rgb(255,0,0) = Red
[ 0, 51, 0],
[ 51, 51, 0],
[102, 51, 0],
[153, 51, 0],
[204, 51, 0],
[255, 51, 0],
[ 0, 102, 0],
[ 51, 102, 0],
[102, 102, 0],
[153, 102, 0],
[204, 102, 0],
[255, 102, 0],
[ 0, 153, 0],
[ 51, 153, 0],
[102, 153, 0],
[153, 153, 0],
[204, 153, 0],
[255, 153, 0],
[ 0, 204, 0],
[ 51, 204, 0],
[102, 204, 0],
[153, 204, 0],
[204, 204, 0],
[255, 204, 0],
[ 0, 255, 0],
[ 51, 255, 0],
[102, 255, 0],
[153, 255, 0],
[204, 255, 0],
[255, 255, 0],
...
... up to 256 entries
Run Code Online (Sandbox Code Playgroud)
现在将索引放入调色板中:
In [28]: np.array(im.getchannel(0))
Out[28]:
array([[ 15, 15, 15, ..., 15, 15, 15],
[ 15, 15, 15, ..., 15, 15, 15],
[ 15, 15, 15, ..., 15, 15, 15],
...,
[190, 190, 190, ..., 190, 190, 190],
[190, 190, 190, ..., 190, 190, 190],
[190, 190, 190, ..., 190, 190, 190]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
现在你可以看到图像的顶行有调色板索引15,如果你在前面的调色板中查找它,你会看到是红色的.
现在让我们看看L模式下的相同图像 - 记住L意味着"亮度",这只是一种在黑色到白色的刻度上表示"亮度"的奇特方式,即灰度:
# Open into greyscale, or L mode
In [1]: im = Image.open('a.png').convert('L')
# Dump the pixels
In [2]: np.array(im.getchannel(0))
Out[2]:
array([[76, 76, 76, ..., 76, 76, 76],
[76, 76, 76, ..., 76, 76, 76],
[76, 76, 76, ..., 76, 76, 76],
...,
[29, 29, 29, ..., 29, 29, 29],
[29, 29, 29, ..., 29, 29, 29],
[29, 29, 29, ..., 29, 29, 29]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
那么,现在图像的顶行是76,底行是29.那是什么?那么,将RGB转换为L的公式是:
L = R*299/1000 + G*587/1000 + B*114/1000
因此,在顶行,R = 255,G = 0,B = 0,因此亮度变为:
L = 255 * 299/1000 + 0 + 0
L = 76
Run Code Online (Sandbox Code Playgroud)
在底行,R = 0,G = 0,B = 255,因此亮度变为:
L = 0 + 0 + 255 * 114/1000
L = 29
Run Code Online (Sandbox Code Playgroud)
\xe2\x80\x9cL\xe2\x80\x9d 模式在这里表示灰度......因此它可以容纳 256 种灰色阴影中的任何一种(包括黑色和白色作为灰色阴影)。
\n\xe2\x80\x9cP\xe2\x80\x9d 模式可以容纳 256 种不同的颜色,如红色、蓝色、绿色等......
\n从一种到另一种的转换,如果您的意思是将图像从灰度转换为彩色,反之亦然......是的,这是可能的......
\n示例:8 位黑白图像(技术上灰度图像)为 \xe2\x80\x9cL\xe2\x80\x9d ,任何 8 位彩色图像为 \xe2\x80\x9cP\xe2\x80\x9d 模式。
\n“ L”模式映射到黑白像素(及其间)。“ P”模式映射有调色板。您可以将图像转换为这些模式之一。
from PIL import Image
im = Image.open("im.jpg")
im_l = im.convert('L')
im_p = im.convert('P')
im.show()
im_l.show()
im_p.show()
Run Code Online (Sandbox Code Playgroud)