问题描述
我在 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 (将#修改为@)