首页 > 解决方案 > 如何确定给定的颜色是接近黑色还是接近白色?

问题描述

我从 youtube 下载了一个视频,其中只有黑色或白色。它显然是压缩的,所以我得到了一些条目而不是(255, 255, 255)RGB (0, 0, 0),就像(128, 128, 128) 我在互联网上搜索并找到了这个等式Y = 0.2126*R + 0.7152*G + 0.0722*B但是当我在 python 中编码时,它有时会给我错误的值。如何通过给定的 RGB 元组确定它更接近白色还是黑色?我还编写了公式中的方程来确定 RGB 颜色的感知亮度,但它仍然给我错误的值(颜色比白色更黑)

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))

标签: pythonalgorithmcolorsrgb

解决方案


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

然而,正如所提到的那样(128,128,128),在黑白之间的中间“完全”是灰色的,这可能暗示不是有损压缩问题(这会产生不同的小得多的噪声),而是插值问题......有两种常见情况:

  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 个相邻像素以及中心像素进行(加权)平均并比较结果。


推荐阅读