【问题标题】:Python PIL: best scaling method that preserves linesPython PIL:保留线条的最佳缩放方法
【发布时间】:2011-10-29 02:34:15
【问题描述】:

我有一个黑色背景和白色线条(从 Autocad 导出)的 2D 绘图,我想使用 Python PIL library 创建一个保留线条的缩略图。

但我使用“缩略图”方法得到的只是一张散布着白点的黑色图片。

请注意,如果我将图像放入具有固定宽度的 IMG 标签中,我会得到我想要的(但图像已完全加载)。

在你的 cmets 之后,这是我的示例代码:

from PIL import Image
fn = 'filename.gif'
im = Image(fn)
im.convert('RGB')
im.thumbnail((300, 300), Image.ANTIALIAS)
im.save('newfilename.png', 'PNG')

我该怎么办?

【问题讨论】:

    标签: python thumbnails python-imaging-library


    【解决方案1】:

    thumbnail 使用的默认调整大小方法是 NEAREST,这是一个非常糟糕的选择。例如,如果您将大小调整为原始大小的 1/5,它将输出一个像素并丢弃下一个 4 - 一个像素宽的线只有五分之一的机会出现 结果!

    令人惊讶的是,BILINEAR 和 BICUBIC 并没有好多少。他们采用一个公式并将其应用于距离源点最近的 2 或 3 个像素,但仍有很多像素他们没有看到,而且该公式无论如何都会淡化这条线。

    最佳选择是 ANTIALIAS,它似乎会考虑所有原始图像,而不会丢弃任何像素。线条会变暗,但不会完全消失;如有必要,您可以做一个额外的步骤来提高对比度。

    请注意,如果您正在使用调色板图像,即im.mode == 'P',所有这些方法都将回退到 NEAREST。您必须始终转换为“RGB”。

    from PIL import Image
    im = Image.open(fn)
    im = im.convert('RGB')
    im.thumbnail(size, Image.ANTIALIAS)
    

    这是一个来自electronics.stackexchange 站点https://electronics.stackexchange.com/questions/5412/easiest-and-best-poe-ethernet-chip-micro-design-for-diy-interface-with-custom-ard/5418#5418的示例

    使用默认的 NEAREST 算法,我认为它与您的结果相似:

    使用 ANTIALIAS 算法:

    【讨论】:

    • BICUBICBILINEAR 的行为让我很吃惊。感谢您的澄清!
    • 对不起,但我使用这些方法中的任何一种都得到了相同的结果。我使用从 Autocad 导出的大 GIF 图像 (7000x4000):在转换之前和之后,im.mode 都是“P”。
    • @Don,请注意 convert 不能在原地工作,它会创建一个新图像。
    • @Don,是的:使用 im.convert('RGB') 代替 im=im.convert('RGB')
    • 非常感谢,很好的回答:)
    【解决方案2】:

    默认情况下,im.resize 使用NEAREST 过滤器,它将按照您所看到的方式进行 - 丢失信息,除非它恰好落在适当的模数像素上。

    改为调用

    im.resize(size, Image.BILINEAR)
    

    这应该会保留您的台词。如果没有,请尝试Image.BICUBICImage.ANTIALIAS。其中任何一个都应该比NEAREST 更好。

    【讨论】:

    • 根据 PIL 文档,将过滤器设置为 Image.ANTIALIAS 可以获得最佳质量,但它比 Image.BILINEAR 插值慢。
    • 是的,我不认为 ANTIALIAS 是缩小图像的好选择——它是为放大而设计的。但我想我会提供它作为一个选择,以便唐可以玩。
    • @Leopd 根据文档,ANTIALIAS 下采样,那么为什么你说它是为了扩大规模?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多