我们有一个相当复杂的Python图像处理脚本,使用了PIL和numpy。其中一个步骤需要使用非常敏感的多通道梯度查找表。一旦创建完成,就会保存到多个不同的较小分辨率中。然而,当这样做时,绿色通道(从左到右具有渐变)似乎突然失去了精度。它应该每50个像素左右失去255个值中的1个。但实际上,它开始以每100个像素2个值的速度下降。这会导致巨大的问题,我无法弄清楚PIL为什么会这样做。然而,我发现在地图的其他部分也有1个单位的跳跃,因此我认为问题并不简单,可能不只是缺少一个位的精度。我还注意到在另一个通道上,整个地图似乎被移动了1个值。即使使用“最近”滤镜,一旦缩放,整个地图看起来都不准确。
对于全尺寸图像,我们使用以下代码从numpy数组创建它:
我们接着将其缩小:
我们使用相同的保存命令直接保存第一步后的大文件,这样做是没问题的。在缩放之后,我们在绿色通道上出现了问题。任何帮助都将不胜感激!
编辑:
现在看来很可能是SciPy的问题。以下内容仍会导致问题:
我不理解为什么即使使用最近邻算法也会出现扭曲问题。我将此数组分配为float64,但其中必须涉及代码中的四舍五入问题。
编辑#2:
我进一步尝试了使用OSX内置程序sips下载它,并得到了同样的扭曲!然后我尝试使用Adobe After Effects进行操作,操作正常。然后我安装了imagemagick,现在可以正常工作。如果有人能够解释所有这些方法中发生的原因,我仍将授予奖励。
编辑#3:
根据请求,这里是一个缩放和未缩放的雪碧图片段。在创建它们期间,我发现OSX内置的“预览”应用程序在缩小时也会导致缩放问题,因此我实际上必须使用Photoshop获取原始剪辑。
原始剪辑:
带有失真的缩放。请尝试查看沿水平轴的绿色通道:
请注意,这些裁剪不是完全相同的像素,但是从形状上可以看出它们是从同一区域裁剪出来的。
编辑#4:
我现在尝试通过应用程序内的OpenGL进行此缩放,并发现它也会发生!这必须涉及使用固定位数进行双线性插值的一些基本问题?
对于全尺寸图像,我们使用以下代码从numpy数组创建它:
image = Image.fromarray(imageIn.astype(np.uint8))
我们接着将其缩小:
new_image = image.resize(new_size, scaleFilter)
这个比例总是最大值的一半,我已经尝试了所有可用的比例选项。
然后我们按以下方式将其保存为PNG:
new_image.save(file_name, 'PNG')
我们使用相同的保存命令直接保存第一步后的大文件,这样做是没问题的。在缩放之后,我们在绿色通道上出现了问题。任何帮助都将不胜感激!
编辑:
现在看来很可能是SciPy的问题。以下内容仍会导致问题:
new_array = misc.imresize(imageIn, (x_size, y_size, 4), interp='nearest')
misc.imsave(file_name,new_array)
我不理解为什么即使使用最近邻算法也会出现扭曲问题。我将此数组分配为float64,但其中必须涉及代码中的四舍五入问题。
编辑#2:
我进一步尝试了使用OSX内置程序sips下载它,并得到了同样的扭曲!然后我尝试使用Adobe After Effects进行操作,操作正常。然后我安装了imagemagick,现在可以正常工作。如果有人能够解释所有这些方法中发生的原因,我仍将授予奖励。
编辑#3:
根据请求,这里是一个缩放和未缩放的雪碧图片段。在创建它们期间,我发现OSX内置的“预览”应用程序在缩小时也会导致缩放问题,因此我实际上必须使用Photoshop获取原始剪辑。
原始剪辑:
![enter image description here](https://istack.dev59.com/uY173.webp)
![enter image description here](https://istack.dev59.com/Zo0Zk.webp)
编辑#4:
我现在尝试通过应用程序内的OpenGL进行此缩放,并发现它也会发生!这必须涉及使用固定位数进行双线性插值的一些基本问题?
scaleFilter
? - user2379410imresize()
和imsave()
都内部调用toimage()
,它似乎会将像素值重新缩放为0-255。 - Reti43uint8
中介,这个问题在PIL中被夸大了。 - user2379410