使用PIL(枕头)和图像,但保持良好的分辨率

时间:2019-05-23 15:15:28

标签: image python-imaging-library image-resizing

我正在使用 PIL 调整图像大小。其中大多数为 640x480 ,其中有些更大。它们大多数都在png中,但是我也有jpeg扩展名。 我想将所有图像的大小调整为32x32像素,但是我注意到使用PIL后分辨率似乎有所变化。

我发现这是一个典型的问题,在保存图像时通常会找出一个问题。 我尝试使用不同的“ quality ”值,我阅读了文档,尝试使用不同的参数,例如“ subsampling ”,并尝试jpeg和png格式。

这是我的代码:

from PIL import Image

im = Image.open(os.path.join(my_path, file_name))
            img = im.resize((32, 32))
            if grey_scale is True:
                img = img.convert('L')  # to resize image in gray scale
            img.save(os.path.join(my_path, 
file_name[:file_name.index('.')] + '.jpg'), "JPEG", quality=100) 

这是我的输入图片 Original input image

在这里,我的代码获得了粒状输出

enter image description here

如何将图像调整为较小的尺寸,但要保持很好的分辨率?

2 个答案:

答案 0 :(得分:1)

无法进行所需的图像转换。当您尝试将光栅图像调整为较小的像素尺寸时,您必须对其进行缩采样或根本不对其进行采样(简单调整大小)。即使您可以保留分辨率(图像中的像素总数),但由于像素一次只能代表一种颜色(至少在基于子像素的显示器(如显示器)中),并且最终图像仅具有1024的分辨率它们,并且原始图像中的细节远不如这些数量的像素所代表的那样,这将始终导致最终图像的质量(具有伪像的像素化图像)的质量大大降低。

但这不是一般情况,因为它在很大程度上取决于图像代表的是哪种细节。如果图像不复杂(不包含很多颜色变化),则可以将其调整为质量较低的版本,而不会丢失细节。

746x338尺寸图片

enter image description here

上一张图片的32x32尺寸版本

enter image description here

两个图像之间几乎没有区别(它们的物理尺寸除外),即使它们的尺寸相差很大。原因是这些是在大范围内包含相同像素值的非复杂图像,因此可以轻松调整其大小而不会造成细节损失。

现在,如果对复杂图像尝试相同的过程(如您在问题中给出的过程),结果将是像素化图像。

解决方案:-

  • 您可以选择最终图像中的大尺寸值 (比32x32还要多),以便保持图像质量。

  • 创建与图像等效的Vector,即分辨率 独立的,可以调整为更大或更小的物理尺寸 而不影响图像质量。

PS:- 请勿保存扩展名为.png的{​​{1}}图像,因为jpg是一种有损压缩技术(大部分情况下),这样会导致最终图像的质量较低,即使没有对其进行操纵。

答案 1 :(得分:0)

减小尺寸无法使图像保持清晰,因为它们需要像素,而不能同时保持两者

在这种情况下,可以使用不同的过滤器。参见下面的代码

from PIL import Image
import os
import PIL
filters = [PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,  PIL.Image.ANTIALIAS]
grey_scale = False
i = 0
for filter in filters:
    im = Image.open("./image.png")
    img = im.resize((32, 32), filter)
    if grey_scale is True:
        img = img.convert('L')  # to resize image in gray scale
    i = i + 1
    img.save("./" + str(i) + '.jpg', "JPEG", quality=100)

结果:

Nearest Bilinear Bicubic Antialias

接下来,您不使用resize来保持宽高比。因此,不要使用resize方法,而要同时保留纵横比

,而无需使用thumbnail

from PIL import Image
import os
import PIL
filters = [PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC,  PIL.Image.ANTIALIAS]
grey_scale = False
i = 5
for filter in filters:
    im = Image.open("./image.png")
    img = im.thumbnail((32, 32), filter)
    img = im
    if grey_scale is True:
        img = img.convert('L')  # to resize image in gray scale
    i = i + 1
    img.save("./" + str(i) + '.jpg', "JPEG", quality=100)

结果:

Nearest Bilinear Bicubic AntiAlias