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

问题描述

我在 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 洞察力的人都可以展示它是如何/为什么/在哪里改变的吗?文档中是否有任何我遗漏的说明已更改?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)