python - 如何确定给定的颜色是接近黑色还是接近白色?
问题描述
我从 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))
解决方案
没有样本输入,我们只能猜测......
然而,正如所提到的那样(128,128,128)
,在黑白之间的中间“完全”是灰色的,这可能暗示不是有损压缩问题(这会产生不同的小得多的噪声),而是插值问题......有两种常见情况:
视频源具有某种分辨率,但已以不同的分辨率编码
如果为真,则灰色像素将形成网格状图案(单个像素),其中黑白像素相邻。这可以恢复为原始值,如下所示:
视频以亚像素精度和边界像素位置渲染,偏移 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 个相邻像素以及中心像素进行(加权)平均并比较结果。
推荐阅读
- php - 从图像 url (php) 获取 instagram 用户名的简单方法
- php - 如何轻松地将库添加到 PhpStorm?
- google-chrome - Safari 是否正确处理临时重定向 (307) 到不同域?
- python - 不和谐机器人不回答关键词
- ios - 在所有内容之上显示一个 UIAlertController 并保持在顶部,即使推送另一个视图(iOS 13)
- c# - 如何在 C# 中检索 NTFS 文件属性
- python - 为什么它不打印高达 1000 的 Armstrong 数字?
- c# - C# Rest API File upload
- assembly - MASM 偏移量与用于寻址的标签
- javascript - 在 React Native 项目中出现 3 个错误 1:React Native CLI 错误 2:Android 开发环境错误 3:模拟器错误