为什么用PIL在Python中重新缩放图像时出现负像素值?

3 投票
1 回答
1778 浏览
提问于 2025-04-18 06:29

我正在尝试用PIL的resize函数把一个32x32像素的图像缩放到28x28像素。我先读取了一张PGM格式的图像,里面的像素值只有255和0(我已经检查过文件确认了这一点)。但是,当我进行缩放时,有些像素值变成了负数。

currIm = Image.open(os.path.join(currSrc,currFile))
currIm2 = currIm.resize((28,28), Image.BICUBIC

imData = numpy.asarray(currIm)
imData2 = numpy.asarray(currIm2)

在imData中,所有的值都是0.0或255.0,这正是我所期望的。然而,在imData2中,经过“抗锯齿”处理的像素值往往是负数,值的范围从0到-50,通常在-30左右。

这为什么会发生,我该怎么解决呢?顺便提一下,currIm和currIm2的模式都是'F'(浮点数?)

注意:这似乎与Image.BILINEAR插值没有关系。

1 个回答

2

PIL的实现可能实际上是正确的。

一些插值函数,比如双立方插值,容易出现“过冲”的现象。简单来说,如果某个小区域内的数值变化非常剧烈,插值函数可能会产生超出原始范围的数值。

你可以看看维基百科上关于 双立方插值 的文章。里面有一张示例图,展示了一些效果,并提到了 锐度振铃削波 的相关内容。

撰写回答