【发布时间】:2016-11-20 01:30:26
【问题描述】:
我需要使用 VIPS 将一些图像缩小 2 或 3 倍。这必须通过简单的像素合并(像素平均)来实现,无需额外的平滑或插值。
VIPS 提供了多种不同抽象级别的函数来调整图像大小(调整大小、缩小、缩小、仿射等)。它还为这些函数提供了不同的插值方法。
我想知道是什么函数和方法的组合导致了 VIPS 中的简单像素合并。一个基本的例子会很有帮助。
【问题讨论】:
标签: python image-processing vips
我需要使用 VIPS 将一些图像缩小 2 或 3 倍。这必须通过简单的像素合并(像素平均)来实现,无需额外的平滑或插值。
VIPS 提供了多种不同抽象级别的函数来调整图像大小(调整大小、缩小、缩小、仿射等)。它还为这些函数提供了不同的插值方法。
我想知道是什么函数和方法的组合导致了 VIPS 中的简单像素合并。一个基本的例子会很有帮助。
【问题讨论】:
标签: python image-processing vips
您需要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")
我在手册该部分的介绍中添加了一个注释,解释了收缩和缩减的作用。
【讨论】: