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

3

我从YouTube下载了一个视频,里面只有黑色或白色。很明显它是被压缩过的,所以我得到的 RGB 值不是 (255, 255, 255) 或者 (0, 0, 0),而是像 (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))

1
啊,这种灰色完全是由于压缩伪像导致的。 - Dave S
你是否在另一个函数中定义了一个函数?这是可能的吗? - Soroosh Noorzad
1
“(128, 128, 128)” 正好处于黑色和白色之间的中间,你还能期待什么呢? - xjcl
2
@AleksanderIkleiw,你能给一个例子,其中你得到了一个“false”的结果吗? - xjcl
3
这个方程式没有关联性。如果R、G、B三个通道的值相等,那么你的图片已经是灰度图像了,因此你可以舍弃其中两个通道而不会丢失信息。只需选择任意一个通道,判断其最接近0还是255,就可以得到最佳结果。 - Mark Setchell
显示剩余5条评论
1个回答

0

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

但是正如提到的那样,(128,128,128)是灰色,恰好处于黑白之间,这可能暗示着不是有损压缩问题(这将产生不同得多的噪声),而是插值问题... 有两种常见情况:

  1. 视频源的分辨率与编码后的分辨率不同

    如果是真的,灰色像素将形成类似网格的模式(单个像素),其中黑色和白色像素相邻。可以通过以下方式恢复回原始值:

  2. 视频以亚像素精度渲染,边缘像素位置偏移了0.5个像素

    在这种情况下,灰色像素不会形成网格,但可能会在B/W对象边界部分形成分组像素(曲线块),这些部分与像素网格不完全对齐。

    没有任何关于对象的信息,无法恢复... 如果您知道它应该是什么形状和大小,可以进行适配并重新渲染...

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

有损压缩

如果您的灰色像素不仅出现在黑白边框上,那么可能确实是有损压缩,但正如我之前所写的那样,这很可能会导致许多不同的颜色更接近于(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个相邻像素以及中心像素进行比较结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接