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

Image 使用PIL(枕头)和图像,但保持良好的分辨率,image,python-imaging-library,image-resizing,Image,Python Imaging Library,Image Resizing,我正在使用PIL调整图像大小。大多数是640x480,有些更大。大多数是png格式的,但我也有jpeg扩展名。 我想将所有图像的大小调整为32x32像素,但我注意到使用PIL后分辨率似乎发生了变化 我发现这是一个典型的问题,而且在保存图像时往往会出现问题。 我尝试了不同的“质量”值,我阅读了文档,尝试了不同的参数,如“子采样”,并尝试了jpeg和png格式 这是我的密码: from PIL import Image im = Image.open(os.path.join(my_path, f

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

我发现这是一个典型的问题,而且在保存图像时往往会出现问题。 我尝试了不同的“质量”值,我阅读了文档,尝试了不同的参数,如“子采样”,并尝试了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) 
这里有我的输入图像

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


如何调整图像的大小,使其更小,但保持很好的分辨率?

您想要的图像转换是不可能的。当您尝试将光栅图像调整为较低的像素尺寸时,必须对其进行下采样,或者根本不采样(简单调整大小)。即使您可以保留分辨率(图像中的像素总数),但由于像素一次可以表示一种颜色(至少在基于亚像素的显示器(如显示器)中),并且最终图像只有1024种颜色,并且原始图像中的细节远远超过这些像素数所能表示的颜色,这通常会导致最终图像的质量显著降低(带有伪影的像素化图像)

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

746x338维图像

先前图像的32x32维版本

这两个图像之间几乎没有差别(除了它们的物理尺寸),即使它们的尺寸有很大的差别。原因是这些是非复杂图像,在很大范围内包含相同的像素值,这使得调整它们的大小更容易,而不会丢失细节

现在,如果在复杂图像上尝试相同的过程,就像你在问题中给出的那样,结果将是一个像素化图像

解决方案:-

  • 您可以在最终图像中选择较大的尺寸值 (比32x32多得多)如果您想保持图像质量

  • 创建图像的向量等价物,即分辨率 独立,可调整大小为较大/较小的物理大小 不影响图像质量

p.S.:-
不要使用
.jpg
扩展名保存
.png
图像,因为jpg是一种有损压缩技术(在大多数情况下),这反过来会导致最终图像质量较低,即使没有对原始图像进行任何处理,也会导致原始图像质量较低

缩小尺寸,您无法保持图像清晰,因为您需要像素,而无法同时保持两者

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

从PIL导入图像
导入操作系统
进口PIL
过滤器=[PIL.Image.NEAREST,PIL.Image.BILINEAR,PIL.Image.BICUBIC,PIL.Image.ANTIALIAS]
灰度=假
i=0
对于过滤器中的过滤器:
im=Image.open(“./Image.png”)
img=im.resize((32,32),过滤器)
如果灰度为真:
img=img.convert('L')#以灰度调整图像大小
i=i+1
img.save(“./”+str(i)+'.jpg',“JPEG”,质量=100)
结果:

接下来,使用
resize
不维护纵横比。因此,不要使用
调整大小
,而是使用
缩略图
方法,该方法同时保持纵横比

从PIL导入图像
导入操作系统
进口PIL
过滤器=[PIL.Image.NEAREST,PIL.Image.BILINEAR,PIL.Image.BICUBIC,PIL.Image.ANTIALIAS]
灰度=假
i=5
对于过滤器中的过滤器:
im=Image.open(“./Image.png”)
img=im.缩略图((32,32),过滤器)
img=im
如果灰度为真:
img=img.convert('L')#以灰度调整图像大小
i=i+1
img.save(“./”+str(i)+'.jpg',“JPEG”,质量=100)
结果: