为什么PIL.resize()会改变颜色?

2024-10-01 02:25:40 发布

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

我正在尝试使用PIL调整存储为NumPy数组的图像的大小。但它似乎也使不同频道的颜色正常化,这是我不想要的

如果我打印原始图像和修改后的图像的min()mean()max(),我会得到以下结果:

0 139.3552607574856 255
0 92.91526075748563 235
0 62.96987110846718 207

0 116.63458655562165 255
0 162.5862423160817 255
0 189.97112433075552 255 

因此,生成的图像看起来像原始的蓝色油漆

以下是我用于调整大小的代码:

def resize(img, shape):
    pil_img = np2pil(img)
    pil_img = pil_img.resize((shape[1], shape[0]))
    np_img = pil2np(pil_img)
    return np_img


def np2pil(img):
    return Image.fromarray((img * 255).astype('uint8'))


def pil2np(img):
    np_img = np.asarray(img)

    if np_img.max() <= 1:
        return (np_img * 255).astype(int)
    else:
        return np_img

图书馆版本:

numpy==1.19.0
Pillow==7.2.0

Tags: 图像numpyimgreturnpildefnp数组
1条回答
网友
1楼 · 发布于 2024-10-01 02:25:40

根据您的输出,我假设原始输入图像已经是np.uint8类型!?如果是这样,为什么要与255相乘,并在np2pil中键入cast to np.uint8?整体创建整数溢出(这解释了颜色的变化);实际调整大小与该问题无关

如果我相应地更正np2pil

def np2pil(img):
    return Image.fromarray(img)

一切都很好。对于某些图像,我得到以下“before”和“after”min()mean()max()值:

0 103.00595625 255
0 91.01710625 255
0 85.2306375 255

1 103.01525 249
0 91.029375 255
0 85.249525 255

由于调整大小过程中涉及的插值,可能会出现细微差异

                    
System information
                    
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
NumPy:       1.19.4
Pillow:      8.1.0
                    

相关问题 更多 >