如何解决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 举报,一经查实,本站将立刻删除。