为什么红绿蓝三种颜料混在一起是黑色,计算机中红绿蓝三种白色?

主要是因为颜料是用于控制反射光,计算机一般处理的是光源发射的光,主要表现光源的颜色。
用RGB来举例子,计算机处理中一般某个值越大,代表光源发射这个光的强度越高,即(0,0,0)代表不发光,(255,0,0)代表红光发射达到最大值。
这一套如果直接套用在颜料上,则某个值越大代表他对这个颜色的光吸收越多。
那么红色颜料就是(0,255,255),表它对红色光吸收为0,所以它反射红光,表现为红色,依次类推,绿色(255,0,255)、蓝色(255,255,0),混合后取平均值(170,170,170),即对光照的3原色均匀吸收2/3,跟未添加颜料相比,它表现为某种灰黑色。

知乎上一篇回答讲得很清楚:
作者:伊卡鲁斯二号
链接:https://www.zhihu.com/question/28448915/answer/300138450

各个波段都均匀强度的光,被称为白色。没有看到光或光反射的情况,被称为黑色。不过人眼睛一般会把较为均匀的强光都判定为白色,把较均匀的明显比周围环境暗的区域都判定为黑色。纯白光可以分解成红绿蓝三种单色光(原因见:什么是颜色?),俗称RGB。靠叠加单色光形成新颜色的组合方式被称为加色系,当三种颜色都加上后,就变回白光了。加的颜色越多,就会更多的光射出,总的亮度就越大。
R红 G绿 B蓝,两两混合得洋红、黄、青三色,这三种是组合色
但对于色料而言,它本身不会发光,靠反射被看见。它们的吸收峰值在某些特定的波段,会剩下不吸收的那部分,故称减色系,是在充足的纯白色光源照射下,减掉特定颜色所产生的。所以最基础的三基色就是只吸收红、绿、蓝一种色光的颜料,它们分别是:青色吸收红光、洋红色吸收绿光、黄色吸收蓝光,俗称CMYK。CMYK最亮的亮度就是环境亮度,加的颜色越多就会越暗(即颜色“深”)。CMYK色系,C青 M洋红 Y黄 K黑
CMYK色系,C青 M洋红 Y黄 K黑将这三种色料再两两混合,就会产生红绿蓝了。这是同时减掉两种颜色的结果。以绿色为例,它是青和黄混合的产物,所以吸收蓝色与红色。同理,蓝色吸收红与绿、红色吸收蓝与绿。三种色料全部混合会产生灰褐色,由于吸收不可能是完美的,所以颜色不够深,一般会人为添加另一个全波段吸收率极高的黑色颜料K。若两种色料混合后,形成灰黑色,我们就称这两种色料为“补色”(在上面两张图中表现为隔着中央黑白色块正对面的两种颜色)。红绿蓝三种色料彼此都很接近补色,任意混合两种,都能形成很深的颜色。但在足够充分的白光照射下,减掉的份数不相同,所以不是纯黑:比如颜料蓝+绿=(过量)白-2红-1绿-1蓝=很暗的青色(其实青色就是蓝绿色的意思),因为剩余了更多的绿和蓝。这点与加色系的组合方式类似。色相环,沿直径线正对面的两种颜色为互补色
原理上,互补色就是可以把光全波段加上或者全波段吸完的两种色光或颜料。当红绿蓝三种颜色都混合起来的时候,就变成了:(过量)白-2红-2绿-2蓝,由于减掉的各种颜色数量相等,看起来就只是比白纸暗了,人脑会判定为黑色。其实,这只有洋红、黄、青三基色直接混合产生的黑的一半亮。根据补色关系,你没有必要把红绿蓝混在一起形成黑色,你只需要红+青,蓝+黄,绿+洋红,即可等比例减去红绿蓝三色。留个思考题,如果这里不是颜料,而是色光,互补色的色光混合会变成什么颜色?

以下是一个简单的示例代码,用于在黑色背景下识别红绿蓝三种颜色: ```python import cv2 import numpy as np # 读取图片 img = cv2.imread('test.jpg') # 将图片转换到HSV空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义颜色范围 lower_red = np.array([0, 50, 50]) upper_red = np.array([20, 255, 255]) lower_red2 = np.array([340, 50, 50]) upper_red2 = np.array([360, 255, 255]) lower_green = np.array([60, 50, 50]) upper_green = np.array([100, 255, 255]) lower_blue = np.array([100, 50, 50]) upper_blue = np.array([140, 255, 255]) # 根据阈值构建掩膜 mask_red1 = cv2.inRange(hsv, lower_red, upper_red) mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2) mask_red = mask_red1 + mask_red2 mask_green = cv2.inRange(hsv, lower_green, upper_green) mask_blue = cv2.inRange(hsv, lower_blue, upper_blue) # 对原图像和掩膜进行位运算 res_red = cv2.bitwise_and(img, img, mask=mask_red) res_green = cv2.bitwise_and(img, img, mask=mask_green) res_blue = cv2.bitwise_and(img, img, mask=mask_blue) # 显示图像 cv2.imshow('Original', img) cv2.imshow('Red', res_red) cv2.imshow('Green', res_green) cv2.imshow('Blue', res_blue) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,`test.jpg`是需要处理的图片文件,首先将图片转换到HSV空间,并分别定义红、绿、蓝三种颜色的HSV值范围。然后通过`cv2.inRange()`函数根据阈值构建掩膜,最后对原图像和掩膜进行位运算得到处理结果。运行以上代码,可以在窗口中看到原图像和分别识别出的红、绿、蓝三种颜色的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值