当使用各种不同的方法进行降尺度时,图像梯度变得不准确

2024-03-29 12:34:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个用Python编写的相当复杂的图像处理脚本,它使用PIL和numpy。对于其中一个步骤,我们有一个非常敏感的多通道梯度,这是一个查找表。一旦它被创建,它被保存到多个不同的更小的分辨率。然而,当这种情况发生时,具有从左到右的渐变的绿色通道突然显得失去了知觉。它应该每50像素丢失255个值中的1个。相反,它开始在每100个像素处下降2个值。这导致了巨大的问题,我不明白为什么皮尔要这么做。但是,我确实在地图的其他部分看到1的跳跃,所以我不认为这是一个简单的,因为它缺少一点精度。我还注意到在另一个频道上,整个地图好像被移动了1个值。即使使用“最近的”过滤器,一旦缩放,整个东西看起来都不准确。在

对于全尺寸图像,我们使用以下内容从numpy数组创建它:

image = Image.fromarray(imageIn.astype(np.uint8))

然后按比例缩小:

^{pr2}$

比例总是最大的一半,我已经尝试了所有可用的缩放选项。在

然后将其保存为PNG,如下所示:

new_image.save(file_name, 'PNG')

我们在步骤1之后直接用相同的save命令保存两个大的。比例尺过后,我们在绿色通道上讨论这个问题。任何帮助都太好了!在

编辑:

现在看来,这似乎是科学院的一个问题。以下仍然是导致该问题的原因:

    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

扭曲缩放。试着沿着水平轴看绿色通道

enter image description here

请注意,这些剪报不是完全相同的像素,而是从同一个区域剪下的,正如你可以看到的形状一样

编辑#4

我现在已经尝试在应用程序中通过OpenGL进行这种缩放,我发现它也发生在那里!这和用固定位数做双线性插值的一些基本问题有关?在


Tags: imagenumpy编辑newpngsave地图情况
1条回答
网友
1楼 · 发布于 2024-03-29 12:34:12

当使用skimage缩放50%时,以下代码似乎正确:

import numpy
import skimage
import skimage.io

img = skimage.io.imread('uY173.png')

import skimage.transform

img50_order0 = skimage.img_as_ubyte( skimage.transform.rescale(img, 0.5, order=0, clip=True) )
img50_order1 = skimage.img_as_ubyte( skimage.transform.rescale(img, 0.5, order=1, clip=True) )

img50_lm = numpy.rint( skimage.transform.downscale_local_mean(img, (2,2,1), clip=True) )

import scipy.ndimage.interpolation

img50_nd = scipy.ndimage.interpolation.zoom(img, (0.5, 0.5, 1))

# plot section of green channel along horizontal axis
plot(img50_order0[50, :, 1])
plot(img50_order1[50, :, 1])
plot(img50_lm[50, :, 1])
plot(img50_nd[50, :, 1])

这不(据我所知)取决于引擎盖下的PIL。源图像被读取为uint8,每幅图像都以微妙的不同方式进行处理和取整,从而产生uint8输出。所有这些之间的差别永远不会超过1,但步骤永远不会是2大小。在

相关问题 更多 >