【问题标题】:Shrinking image by pixel-binning using VIPS使用 VIPS 通过像素合并缩小图像
【发布时间】:2016-11-20 01:30:26
【问题描述】:

我需要使用 VIPS 将一些图像缩小 2 或 3 倍。这必须通过简单的像素合并(像素平均)来实现,无需额外的平滑或插值。

VIPS 提供了多种不同抽象级别的函数来调整图像大小(调整大小、缩小、缩小、仿射等)。它还为这些函数提供了不同的插值方法。

我想知道是什么函数和方法的组合导致了 VIPS 中的简单像素合并。一个基本的例子会很有帮助。

【问题讨论】:

    标签: python image-processing vips


    【解决方案1】:

    您需要shrink。使用整数参数,它可以对像素进行简单的块平均。

    im = Vips.Image.new_from_file("somefile.jpg")
    im = im.shrink(2, 2)
    im.write_to_file("someotherfile.tif")
    

    像素格式保持不变,因此对于 uchar 图像,您将获得 uchar 平均值,四舍五入到最接近的值。如果您想要一些不同的东西,可以使用投射来浮动、缩小和环绕自己。

    libvips 将图像分辨率(每英寸的像素数,或任何单位)视为系统为您携带并用于加载和保存操作的元数据,但不会由 vips 本身更新。这是因为图像分辨率通常比单位距离像素的简单测量更复杂,并且应用程序比库更有可能做正确的事情。

    如果要读出分辨率,请使用.xres.yres。它们始终以每毫米像素为单位,并在加载和保存时转换为适当的单位。

    print "im.xres =", im.xres, "ppm"
    

    libvips 图像是不可变的,因此您不能只分配给 xres/yres,您需要创建一个更改了这些值的新图像。要设置新值,请使用.copy()。在幕后,.copy() 只是复制指针,所以速度非常快。上面的例子可以是:

    im = Vips.Image.new_from_file("somefile.jpg")
    im = im.shrink(2, 2)
    im = im.copy(xres = im.xres / 2.0, yres = im.yres / 2.0)
    im.write_to_file("someotherfile.tif")
    

    我在手册该部分的介绍中添加了一个注释,解释了收缩和缩减的作用。

    【讨论】:

    • 有没有办法影响 xres 和 yres 而不是 width 和 height?
    • 抱歉,我不确定你的意思。是否要更改图像上的每英寸像素元数据?
    • 如果我可以在调整大小后独立设置,那就太好了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    相关资源
    最近更新 更多