首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么PIL.resize()会改变颜色?

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

Stack Overflow用户
提问于 2020-07-18 20:33:04
回答 1查看 81关注 0票数 0

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

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

代码语言:javascript
复制
0 139.3552607574856 255
0 92.91526075748563 235
0 62.96987110846718 207

0 116.63458655562165 255
0 162.5862423160817 255
0 189.97112433075552 255 

因此,生成的图像看起来就像蓝色的原始绘画。

下面是我用来调整大小的代码:

代码语言:javascript
复制
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

库版本:

代码语言:javascript
复制
numpy==1.19.0
Pillow==7.2.0
EN

回答 1

Stack Overflow用户

发布于 2021-01-06 21:36:54

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

如果我相应地修改了np2pil

代码语言:javascript
复制
def np2pil(img):
    return Image.fromarray(img)

一切都运行得很好。对于一些图像,我得到了以下“之前”和“之后”的min()mean()max()值:

代码语言:javascript
复制
0 103.00595625 255
0 91.01710625 255
0 85.2306375 255

1 103.01525 249
0 91.029375 255
0 85.249525 255

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

代码语言:javascript
复制
----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
NumPy:       1.19.4
Pillow:      8.1.0
----------------------------------------
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62968624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档