本文介绍了如何将一个变量生成的RGB颜色变暗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我有两个RGB颜色变量:X= (randint(0, 256), randint(0, 256), randint(0, 256))变量X是随机RGB颜色Y= ???如何才能使变量Y生成颜色X的稍暗版本,以创建对比度?示例:问候!推荐答案如果您希望至少在一定程度上感觉准确且结果可重复,则需要使用感觉上一致的颜色或外观模型。HSL或HSV在感知上不是一致的模型(甚至不是很接近)。对比原因那么下一个问题是你的最终目标是什么?例如:这是电脑显示器上的颜色吗?还是打印?是否要保持相同的色调?饱和度如何?对比的目的是什么?用于文本的可读性?用于定义用户界面元素?纯粹是为了装饰还是设计?您对这些问题的回答推动了方法的发展。为了回答这个问题,我将做出以下假设:用于计算机或移动设备显示器。相对于随机颜色独立且可重复地控制色调、饱和度和亮度。出于文本可读性等功能原因,需要进行对比。轻松上色首先,严格地说,颜色并不是真实的,它只是对各种波长的光的一种感知。尽管现实世界中的光是线性工作的,但我们的感知绝对是非线性的,而且对环境非常敏感。因此,为了通过计算得到想要的颜色结果,我们需要预测对该颜色的感知,这是CIECAM02、Ja以及CIELAB和CIELUV等均匀色彩空间的动机。为保证准确性,请使用类似CIECAM02或CIECAM16的代码。尽管这些可能比你实际需要的更复杂。CIELAB和CIELUV更简单、更易于集成,并且有大量支持LAB和LUV的色库代码库。LUV、LAB和L星LAB通常将Lab用于反射颜色,虽然它可以用于光源,但它存在一些问题,使其不适用于光源。LAB有L频道,也称为和LStar";,它是感知亮度,基于我们的感知对亮度(Y)进行编码。然后ab编码对手颜色,a表示红色/绿色,b表示蓝色/黄色。这些独立的通道形成3D笛卡尔空间,但Lab也可以转换为极坐标空间lch、亮度、色度和色调。Luv对反射颜色不是很有用,但它具有一些功能,使其成为光源的理想选择,并扩展到自发光显示器。美国的MIL-SPEC定义了使用uʹvʹ的彩色光源,在更多现代型号出现之前,luv基本上被用于电视后期制作。(CIECAM02更好、更准确地覆盖反射和发射的颜色,但同样要复杂得多)。LUV具有完全相同的LL对于颜色坐标,uvv基于1976年ucs色度图的uʹvʹ坐标。除了LUV的3D笛卡尔空间外,它还可以转换为极坐标、lch和lsh、亮度、色度和色调,还可以转换为亮度、饱和度和色调。能够独立控制饱和度是一个有用的优势,因为它允许我们在独立改变亮度和色调时保持感知的色彩恒定(LUV不像其他更先进的模型那样均匀)。对比度如何将RGB值转换为适当的均匀空间后,即可计算色差。在LAB或LUV的情况下,它是两种颜色之间的简单欧几里得距离,换句话说,是差的平方和的平方根,因此:∆=((L-L+(u>-u2)+(v>2)))足够。空间频率和视觉的许多其他方面,如适应、连续对比度、HK效应等,也起到了作用完全公开:我们正在开发一种新的可读性对比度方法,称为APCA,用于Web标准,部分使用感知编码的亮度值差异。实现将RGB值转换为线性,这意味着不能有任何伽马编码。如果您要生成一组随机的RGB值,但要将它们发送到sRGB监视器,则假定sRGB色彩空间和D65。8位值需要为0-255,但我们需要将它们作为十进制浮点0.0-1.0将线性RGB值转换为CIEXYZ空间。-根据您的需要,您可以假设您的随机值为0.0-1.0为线性值。在将它们发送到监视器之前,不要忘记对它们进行伽马编码。从XYZ转换为CIELUV。可以选择转换为极轴空间,以便独立控制饱和度和色调。在LUV空间中,您可以选择满足对比度需求的颜色,然后通过反转变换将其转换回RGB。同样,∆L是最重要的,并且在实验室和luv中,您都可以更改L,而无需接触颜色坐标。数学和其他东西Bruce Lindbloom's site中有一个很棒的资源,其中包含执行这些运算所需的所有数学知识。8位整数RGB值通常需要为0-255,但对于我们将要执行的转换,我们需要将它们作为十进制浮点0.0-1.0,并且由于您只是随机生成它们,我们假设它们是线性RGB值。 # random numbers set with the low set to prevent very dark colors. Rlin = random.uniform(0.012,1.0) Glin = random.uniform(0.04,1.0) Blin = random.uniform(0.004,1.0)由于我们假设它们已经是线性的,因此转换为XYZ。将线性RGB到XYZ到LUV/LCH/LSH的转换下面的函数是根据SeeLab Project我的JS修改的,To矩阵的数据来自brucelindbloom.com。我还没有在Python中测试代码,因为我只是将它从我的JS项目移到了那里,所以它是";ASIS,Vid where Static,Your Mileage可能是一个变量... # D65 matrix into XYZ from X = Rlin * 0.4124564 + Glin * 0.3575761 + Blin * 0.1804375 Y = Rlin * 0.2126729 + Glin * 0.7151522 + Blin * 0.0721750 Z = Rlin * 0.0193339 + Glin * 0.1191920 + Blin * 0.9503041 Lstar = math.pow(Y, 0.425) # Create lightness (shortcut version) # Note: Lstar above is an unofficial shortcut # using a simple power curve instead of the piecewise. # The official equation for Lstar is this ternary: # Lstar = math.pow(Y, 1/3) * 116.0 - 16.0 if Y > (216/24389) else Y * (24389/27) # Process to LUV Uref = 0.19783982482140775648 Vref = 0.46833630293240970476 divisor = (X + 15.0 * Y + 3.0 * Z) UCSu = ((4.0 * X) / divisor) UCSv = ((9.0 * Y) / divisor) Ustar = 13.0 * Lstar * (UCSu - Uref) Vstar = 13.0 * Lstar * (UCSv - Vref) # Optional — create polar coordinates LCh and/or Lsh UVchroma = math.pow(Ustar * Ustar + Vstar * Vstar, 0.5) UVhue = 180.0 * math.atan2(Vstar,Ustar)/math.pi if UVchroma > 0.01 else 0.0 # if UVchroma less than 0.01, clamp hue to 0 UVhue = UVhue + 360.0 if UVhue < 0.0 else UVhue # Make hue positive if it isn't UVsat = UVchroma / Lstar # Create the saturation correlate因此,您的三个线性RGB值最终为:lStar感知亮度0.0%-100.0Ustar&;Vstar色度坐标UVchroma色彩与亮度无关(如果使用饱和度则忽略)UVhue色调(以度为单位)UVsat饱和度,即色彩与亮度的关系。因此,如果您想保持色调和色彩恒定,并且只影响亮度,则只需调整变量LStar,然后使用以下顺序转换回XYZ,从前到后:LStar,to Y,一切都与亮度有关UVsat,乘以LStar得到色度UVchroma、UVhue,这些现在为您提供Ustar&;VstarUstar、Vstar、LStar和Y可以得到X和Z。然后将XYZ转换为线性RGB,然后应用sRGB TRC(AKS Gamma),最后将0.0-1.0转换为0-255。将LUV转换为XYZ到sRGB Y = math.pow((Lstar + 16) / 116, 3) if Lstar > 8.0 else Lstar / (24389/27) UVchroma = UVsat * Lstar if (UVsat * Lstar) > 0.1 else 0.0 Ustar = UVchroma * math.cos(UVhue * (math.pi/180)) Vstar = UVchroma * math.sin(UVhue * (math.pi/180)) fA = Y * (((39.0 * Lstar) / (Vstar + 13.0 * Lstar * Vref)) - 5.0) fB = Y * -5.0 fC = (((52.0 * Lstar) / (Ustar + 13.0 * Lstar * Uref)) - 1.0) / 3 fD = -1/3 X = (fA - fB) / (fC - fD) Z = X * fC + fB // sRGB D65 matrix linRGB = [X * 3.2404542 + Y * -1.5371385 + Z * -0.4985314, X * -0.9692660 + Y * 1.8760108 + Z * 0.0415560, X * 0.0556434 + Y * -0.2040259 + Z * 1.0572252] // Take the linear sRGB and gamma encode the convert to 8 bit int // NOTE: This is the "simple" version. newRGB = [max(min(int(math.pow(linRGB[0], 1/2.2) * 255), 255), 0), max(min(int(math.pow(linRGB[1], 1/2.2) * 255), 255), 0), max(min(int(math.pow(linRGB[2], 1/2.2) * 255), 255), 0)]重要的是要知道,从线性编码到伽马编码的sRGB 8bit的转换使用的是简单方法,而不是IEC标准中的分段方法。简单的方法应该适用于您的用例。我在this answer中讨论了分段编码的数学原理,基本上是这样的:维基百科也有interesting discussion of the piecewise transform.您可能会对我对this other contrast question here on Stack的回答感兴趣。干杯。 这篇关于如何将一个变量生成的RGB颜色变暗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 10-21 23:25