在Linux上,Python Pillow图像质量不同

3
我有一个使用selenium驱动的在线游戏机器人,它通过图像识别(查找子图像)来工作。在Windows中,我的机器人可以正常运行;但是,在Ubuntu中,我的机器人无法工作。
机器人的工作方式如下:
1. 捕获selenium中的元素屏幕截图 2. 使用pillow加载屏幕截图 3. 在大屏幕截图中查找子图像(本地图像)
我已经追踪到问题出现在用于查找子图像的函数上。这是因为Ubuntu上的屏幕截图图像质量不同,无法进行逐像素匹配。
在Windows上工作的针和草堆图像集在Ubuntu上也能正常工作,反之亦然——从Ubuntu创建的不起作用的针和草堆图像集在Windows和Ubuntu上都无法工作。
我的屏幕截图在Windows中始终为~6KB,在Ubuntu中为~5KB。
当我在PIL中打开并保存本地的“针”图像时,它的大小从1.7KB变为1.5KB,结果无法使用。这是代码的非500行版本:
# imports and everything else here..

browser.save_screenshot("haystack.png") # selenium screenshot
haystack = Image.open("haystack.png")
needle = Image.open("needle.png") # the needle is a local file

haystack.save("haystack_new.png","PNG",quality=100) # DEBUGGING
needle.save("needle_new.png","PNG",quality=100) # DEBUGGING

# call "needle in a haystack" locator function here

有人能告诉我出了什么问题吗?为什么Linux的截图质量较低?我应该安装不同版本的zlib还是直接使用opencv?


是的,这两个平台上的"haystack"都是250x75。 - Oliver Closeoff
1
PNG是无损的('quality ='决定了花费多少时间进行无损压缩),因此必须发生其他有损失的事情。一个很好的候选人是Ubuntu图像是否使用颜色板(可能是因为Ubuntu显示器是256色)。查看干草堆图像的元数据,它们是否相同,例如24位,还是一个256色?还要比较原始Windows干草堆的元数据与从PIL / pillow保存的版本。 - DisappointedByUnaccountableMod
我安装了ImageMagick,并在一个用paint编辑并保存为PNG格式的屏幕截图,一个在Windows上生成的草堆和一个在Ubuntu上生成的草堆上运行了identify -verbose命令。它们看起来非常相似。Selenium带编辑的屏幕截图 Windows Ubuntu草堆 - Oliver Closeoff
1
是的,没有明显的差异。我猜测您们各自的浏览器/操作系统渲染颜色不同,因此不能进行像素比较。您可能需要使用更适应性更强的模糊算法进行针搜索,不知道在opencv中是否可能实现。例如,请参见http://graphicdesign.stackexchange.com/questions/32276/why-does-my-hexadecimal-color-in-one-browser-render-differently-in-another-brows或https://fstoppers.com/education/how-your-web-browser-affects-way-colors-are-rendered-77241或https://css-tricks.com/color-rendering-difference-firefox-vs-safari/。 - DisappointedByUnaccountableMod
哈哈,我不知道颜色渲染的差异...有了这个想法,我最终从Ubuntu堆栈中衍生出针,并且它起作用了,所以现在我会坚持使用依赖于操作系统的解决方案,直到我能够实现更好的东西。感谢您的所有帮助! :) - Oliver Closeoff
显示剩余2条评论
1个回答

1
不同的浏览器(以及可能是操作系统/窗口管理器)以不同的方式实现颜色渲染 - 因此,显示的像素值可能具有不同的R、G、B值的强度,这些值对人眼不可见,但使得在浏览器/平台之间进行逐像素比较的截屏无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接