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

Posted

技术标签:

【中文标题】python如何在不损失质量的情况下调整(缩小)图像的大小【英文标题】:python how to resize(shrink) image without losing quality 【发布时间】:2020-10-10 10:43:29 【问题描述】:

我想将png图片476x402调整为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 resized:439x371

【问题讨论】:

【参考方案1】:

如何将 2000 像素装入一个只能容纳 1800 像素的盒子中?你不能。

将相同数量的信息(存储为源图像中的像素)放入较小的像素区域仅适用于

丢弃像素(即丢弃单个值或裁剪不是您想要做的图像) 将相邻像素混合成某种加权平均值,然后用稍微改变的 439 像素替换 476 像素

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

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

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


Shrink/resize an image without interpolation How can I sharpen an image in OpenCV?

【讨论】:

我尝试了其他 InterpolationFlags arg。它仍然变得模糊。我只是转换 png,opencv 有其他锐化图像的方法,我尝试使用它们来尽可能恢复源

以上是关于python如何在不损失质量的情况下调整(缩小)图像的大小的主要内容,如果未能解决你的问题,请参考以下文章

在不损失任何质量的情况下调整图像大小[关闭]

在不损失质量的情况下调整图像大小

是否可以在不损失质量的情况下调整 UIImage 的大小?

在 python 中放大 SVG 图像而不损失其质量

如何在不损失质量的情况下将 PNG 转换为 BMP

如何使用 PIL 减小图像文件大小