PIL 更改了将 RGB 转换为 L(灰度)的方式?

时间:2021-07-14 19:16:58

标签: python python-imaging-library rgb grayscale

我在 conda 环境中的两台不同机器上运行完全相同的图像处理代码,我希望它们都能给出相同的结果,但它们没有。所以我做了很多挖掘,发现 PIL 函数 Image.convert() 在两台机器上为完全相同的输入给出不同的输出,这可以解释为一台机器上的 PIL 版本是 6.2.1,而在另一台机器是 7.0.0。

虽然查看 6.2.1 和 7.0.0 的文档,但它们用于将 Image.convert() 中的 RGB 转换为 L 的公式完全没有改变。我克隆了 git repo 并检查了实现差异,似乎没有任何改变:

diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c
index 60513c66..9f572254 100644
--- a/src/libImaging/Convert.c
+++ b/src/libImaging/Convert.c
@@ -44,7 +44,8 @@
 #define L(rgb)\
     ((INT32) (rgb)[0]*299 + (INT32) (rgb)[1]*587 + (INT32) (rgb)[2]*114)
 #define L24(rgb)\
-    ((rgb)[0]*19595 + (rgb)[1]*38470 + (rgb)[2]*7471)
+    ((rgb)[0]*19595 + (rgb)[1]*38470 + (rgb)[2]*7471 + 0x8000)
+
 
 #ifndef round
 double round(double x) {

请注意,对于我从 RGB 到 L(8 位)的转换,上面L24() 宏中的更改应该无关紧要。

我不明白差异来自哪里,但我想了解它。任何拥有更多 PIL 洞察力的人都可以展示它是如何/为什么/在哪里改变的吗?文档中是否有任何我遗漏的说明已更改?

0 个答案:

没有答案