如何确定给定的颜色是接近黑色还是白色?

2024-10-05 17:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我从youtube上下载了一段视频,视频中只有黑色或白色。它显然是压缩的,所以我没有使用(255, 255, 255)(0, 0, 0)RGB,而是使用了一些类似(128, 128, 128)的条目 我在互联网上搜索了一下,发现了这个等式Y = 0.2126*R + 0.7152*G + 0.0722*B,但是当我用python编写这个等式时,它有时会给我错误的值。如何通过给定的RGB元组确定它是更接近白色还是黑色? 我也从Formula to determine perceived brightness of RGB color中对等式进行了编码,但它仍然给了我错误的值(颜色是黑色多于白色)

def rgb_percent(r, g, b):
    sR = r
    sG = g
    sB = b

    vR = sR / 255
    vG = sG / 255
    vB = sB / 255

    def sRGBtoLin(colorChannel):
        if colorChannel <= 0.04045:
            return colorChannel / 12.92
        else:
            return pow(((colorChannel + 0.055) / 1.055), 2.4)

    Rlin = sRGBtoLin(vR)
    Glin = sRGBtoLin(vG)
    Blin = sRGBtoLin(vB)

    y = (0.2126 * Rlin + 0.7152 * Glin + 0.0722 * Blin)

    def YtoLstar(Y):
        if Y <= (216 / 24389):
            return Y * (24389 / 27)
        else:
            return pow(Y, (1 / 3)) * 116 - 16
    return YtoLstar(y)

print(rgb_percent(3, 3,3))

Tags: 视频returndef错误rgbsgsbpercent
1条回答
网友
1楼 · 发布于 2024-10-05 17:25:36

没有样本输入,我们只能猜测

然而,如前所述(128,128,128)在B/W之间的中间是灰色的,这可能暗示的不是有损压缩问题(这将产生不同的更小的噪声),而是插值问题。。。有两种常见情况:

  1. 视频源具有一定的分辨率,但编码方式不同

    如果为真,灰色像素将形成类似网格的图案(单个像素),其中黑白像素相邻。可以将其恢复为原始值,如下所示:

  2. 视频以亚像素精度渲染,边界像素位置以0.5像素关闭

    在这种情况下,灰色像素不会创建网格,但可以在不完全与像素网格对齐的黑白对象边界部分上形成分组像素(曲线块)

    如果没有有关对象的任何信息,则无法还原。。。如果你知道它应该是什么形状和大小,你可以适合它并重新渲染

    廉价的补救方法是将这些颜色设置为黑色或白色(取决于是否要缩小或放大对象)

有损压缩

如果您的灰色像素不仅出现在黑白边界上,那么它可能真的是有损压缩,但正如我之前所写的,这很可能会导致许多不同的颜色更接近(0,0,0)(255,255,255)

还有公式:

I = 0.2126 * Rlin + 0.7152 * Glin + 0.0722 * Blin

不适用于标准化RGB。为此:

I = R + G + B

R == G == B产生灰度颜色时

所以我会这样做(假设8位标准化RGB通道):

if (R+G+B<383) { R=G=B=  0; }
 else          { R=G=B=255; }

然而,为了消除精确的一半问题,我将对4或8个相邻像素以及中心像素进行(加权)平均,并比较结果

相关问题 更多 >