如何在不损失质量的情况下调整(缩小)图像大小

7
我想将一张476x402的PNG图片调整为439x371,并且我尝试使用PIL(image)或者OpenCV的resize方法进行调整,但是结果会导致一些锐利度的损失。调整后,图片变得模糊了。 请问如何在使用Python进行调整时,能够保持图片的锐利度而不损失?
from skimage import transform, data, io
from PIL import Image
import os
import cv2

infile = 'D:/files/script/org/test.png'
outfile = 'D:/files/script/out/test.png'

''' PIL'''
def fixed_size1(width, height):
    im = Image.open(infile)
    out = im.resize((width, height),Image.ANTIALIAS)
    out.save(outfile)

''' open cv'''
def fixed_size2(width, height):
    img_array = cv2.imread(infile)
    new_array = cv2.resize(img_array, (width, height), interpolation=cv2.INTER_CUBIC)
    cv2.imwrite(outfile, new_array)


def fixed_size3(width, height):
    img = io.imread(infile)
    dst = transform.resize(img, (439, 371))
    io.imsave(outfile, dst)

fixed_size2(371, 439)

src:476x402

src:476x402

调整大小:439x371

resized:439x371

2个回答

5

如何将2000个像素装进只能容纳1800个像素的盒子里?不可能。

将相同数量的信息(以源图像中的像素形式存储)放入较小的像素区域中,只能通过以下方式实现:

  • 丢弃像素(即舍弃单个值或裁剪图像,这并不是您想要的)
  • 将相邻像素混合成一种加权平均值,并用略微更改的439个像素替换476个像素

这正是调整图像大小时发生的情况。某种算法(interpolation=cv2.INTER_CUBIC,其他请参见此处)调整像素值以合并/平均它们,以便您不会失去太多信息。

您可以尝试更改算法,也可以应用进一步的后处理(“锐化”)以再次丰富对比度。

在存储图像时,某些格式进行“有损”存储以最小化文件大小(JPG),而其他格式是无损的(PNG,TIFF,JPG2000等),如果选择有损图像格式,可能会进一步模糊您的图像。

请查看


我尝试了其他的InterpolationFlags参数,但仍然模糊。我只是转换png格式,opencv有其他锐化图像的方法,我正在尝试使用它们尽可能地恢复源文件。 - GGS of Future
如果我在Windows照片查看器中查看我的图像,并进行缩放和调整大小以使其适合我在Pillow中生成的缩略图的大小,那么与Pillow相比,Windows照片查看器始终更加清晰和锐利。这就是我试图解决的问题。 - Bobort
@Bobort - 图像优化是一门艺术 ;) - 你可以尝试不同的调整大小方式 - 之后你可能想要研究“锐化”滤镜 - 比如谷歌搜索会导向 https://pythonexamples.org/python-pillow-adjust-image-sharpness/ - 但结果可能因不同的图像来源而异,你可能需要微调参数以获得“优化”的结果。从非压缩的图像格式(不是jpg、png或tif等)开始可能会有所帮助。祝好运 :) - Patrick Artner
1
@PatrickArtner,我进行了更多的调查,并发现我的结论是错误的。Pillow可以很好地生成图像。然而,浏览器并没有将它们呈现得非常清晰,特别是基于Chromium的浏览器。Firefox则能够美丽地呈现图像。我怀疑这与Windows中的DPI或字体大小设置有关,而Chromium正在对该值进行某些操作,使图片看起来模糊。这是2022年一个荒谬的问题,但我们只能接受现实。 - Bobort

-1
如果它们是简单的图像,将图像转换为SVG格式,重新调整SVG格式,然后再转换回PNG格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接