一、由RGB图像转化为灰度图
from PIL import Image
import numpy as np
img = Image.open("haha.jpg")
old_data = np.array(img.getdata()).reshape(-1, 3)
new_img = img.convert("L")
new_data = np.array(new_img.getdata()).reshape(-1)
print(len(new_data), len(old_data))
a = np.array([0.299, 0.587, 0.114])
for i, j in zip(old_data, new_data):
print(i, j, a.dot(i))
input()
灰度值=0.299*R+0.587*G+0.114*B取下界
。
二、为什么RGB的权值不同
根据人视觉形成原理,混合色光能同时刺激多种视锥细胞,比如黄色光能同时刺激专长感受红色的视锥细胞和专长感受绿色的视锥细胞,所以黄色看起来很亮。另外人视锥细胞不同种类的数量也是不同的,专长感受绿色的视锥细胞数量要远多于其他 2 种,所以人视觉对绿色的明度感知要比另外 2 种原色红色、蓝色要敏感的多,甚至比绿、蓝的混合色:品红还要敏感一些。而蓝色的明度感知是最弱的,所以与绿色有关的混合色:黄色、青色 比与绿色无关的混合色紫色(红、蓝的混色)要更亮。如果进行图像色彩通道调整的话就会发现调整绿色通道对图像改变最为明显。
6 种主要色相的层次:
黄 > 青 > 绿 > 品 > 红 > 蓝
三原色:红、绿、蓝视觉感受亮度的比例是(根据常用的标准 CCIR 601 ):
红 2.99 : 绿 5.87 : 蓝 1.14
三、灰度化加速计算
使用整数运算,避免浮点运算 Gray = (R*299 + G*587 + B*114 + 500) / 1000
使用移位运算,避免除法运算
0.299 * 65536 = 19595.264 ≈ 19595
0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469
0.114 * 65536 + (0.896) = 7471.104 + 0.896 = 7472
Gray = (R*19595 + G*38469 + B*7472) >> 16
可能很多人看见了,我所使用的舍入方式不是四舍五入。四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法。
四、图像的mode和format
mode意思是模式,它包括:
- 1 黑白图像
- L 灰度图
- P 调色板图
- RGB 彩图
- RGBA 带透明度的图
mode指的是图像解压完成之后的数据形式。
format指的是图像解压之前在磁盘上的数据形式。
format意思是格式,format跟mode密切相关,有的format只能处理某种mode的图,同时一种mode也可以有多种format来进行存储。
压缩方式有很多种,有通用压缩方式,也有专用压缩方式。
专用压缩方式效率通常比通用压缩方式效率高,因为它充分利用了特定文件的信息。
比如音频、视频、图像都有各自的专有压缩方式,这些专有压缩方式比zip,gz等通用压缩方式效率高。
五、原色的来历
人的眼球内部有锥状细胞 (在正对瞳孔的视网膜中央区域称为黄斑区),能够感受到红光、 绿光与蓝光,因此人类以及其他具有这三种感光受体的生物称为“三色感光体生物”。 而其他一些生物,如虾蛄 ,有十二原色的感光系统。 虽然眼球中的椎状细胞并非对红绿蓝三色的感受度最强,但是肉眼的锥状细胞对于这三种光线频率所能感受的频宽最大,也能够独立刺激这三种颜色的受光体,因此这三色被视为原色。所以"原色"并不是一种物理概念,反倒是一种生物学的概念。
有些物种的眼球具有四种不同的“感光体”,例如许多鸟类及有袋动物都属于这类生物,甚至于有人提出部分女性人类的眼球也具有第四种感光体,除了红绿蓝之外还多了黄色。
另一方面,大多数的哺乳动物都是属于“双色感光体生物”,它们的眼球只有两种感光体。“原色”的指定并没有唯一的选法,因为就理论上而言,凡是彼此之间无法替代的颜色都可以被选为“原色”,只是目前普遍认定“光的三原色”为红绿蓝。 最著名的例子就是在1907年法国卢米埃尔兄弟(Lumiere August and Louis 1862.1864–1954.1948)所发明的天然彩色相片技术 (Autochrome )进入量产时,他们所选定的三原色其实是橙色 (Orange)、 绿色 (Green)、 紫色 (Violet) 。
六、光学三原色和美术三原色
现在常用的三原色概念其实分为美术三原色和色光三原色两种。
我们现在使用的美术三原色指可以认为就是CMY色制,青(Cyan)、洋红(Magenta)、黄(Yellow)。在打印、印刷、油漆、绘画等靠介质表面的反射被动发光的场合, 物体所呈现的颜色是光源中被颜料吸收后所剩余的部分, 成色的原理是减色法原理,色值以0%-100%比例混合,三种颜色最100%混合为黑色,0%为无色。
色光三原色就是RGB三原色,符合加法色原理,三种基本色光就是红(Red)、绿(Green)、 蓝(Blue)、在显示器中值从0-255个亮度阶,三种颜色达到最大值混合为白色,最小值为黑色。
一言以蔽之,光学上的原色是由生物的感光细胞种类决定的,美术三原色是由人们生产生活中的颜料种类决定的。
光学三原色是天然的,美术三原色是人造的。
人的红绿蓝三种感光细胞,如果同时活跃,并且活跃程度相同,人看到的就是灰色。如果活跃程度高,人看到的就是白色;如果活跃程度低,人看到的就是黑色。
七、颜色空间
颜色空间包括RGB(加法三原色),CMY(减法三原色),HSV,HSL等模式。
一种颜色空间其实就相当于一种坐标系,这些颜色空间之间可以进行变换。比如YIQ颜色空间
Y = 0.299R + 0.587G + 0.114B
I = 0.596R - 0.275G - 0.321B
Q = 0.212R - 0.523G + 0.311B
颜色空间有无数种,起个名字就是个名字。人们最常用的就是RGB,它足以表示其它颜色空间。
人眼看到一种颜色,并不会一眼判断出RGB各个分量占多少,RGB只是人眼中三种感光材料的名字。令人感到神奇的是,生物没有进化出感知波长的感光细胞(那样人就只需要一种感光细胞就够了),而是进化出了对光进行分解的三种感光细胞。
人眼的成色原理虽然是RGB,但是人类感知上的颜色却不是RGB,因为人无法立马判断出RGB各个分量的值来。人类感知上更倾向于HSV这种颜色空间。
HSL 和 HSV(也叫做 HSB)是对RGB 色彩空间中点的两种有关系的表示,它们尝试描述比 RGB 更准确的感知颜色联系,并仍保持在计算上简单。HSL 表示 hue(色相)、saturation(饱和度)、lightness(亮度),HSV 表示 hue、saturation、value(色调) 而 HSB 表示 hue、saturation、brightness(明度)。
参考资料
https://www.zhihu.com/question/31352752/answer/51569998
https://www.zhihu.com/question/19646016
http://blog.csdn.net/jiangxinyu/article/details/8000999