如何使用Ruby-Vips V 1.0计算图像平均颜色



在ruby-vips 1.0之前,我可以使用:

获得RGB平均颜色数组
im.stats[1][4].to_i, im.stats[2][4].to_i, im.stats[3][4].to_i

但是在更新了Ruby-VIPS 1.0之后,stats方法不再返回Ruby数组。我注意到有一个im.avg()方法,但是它返回标量值,而不是RGB通道的单独值。

如何使用新的API计算图像平均颜色?

出于历史原因,libvips曾经具有自己的数组类型。它具有操纵这些数组的整个功能,所有功能与操纵图像的功能略有不同。

libvips8通过删除数组类型并使用单带双图像来解决此问题。因此,stats的结果现在是一个小图像,您可以从。

中读取像素值。

使用getpoint从图像读取像素:

http://www.rubydoc.info/gems/ruby-vips/1.0.0.0/vips/image#getpoint-instance-instance-instance_method

例如:

$ irb
irb(main):001:0> require 'vips'
=> true
irb(main):002:0> im = Vips::Image.new_from_file "/home/john/pics/k2.jpg"
=> #<Vips::Image:0x1c83830 ptr=0x1fb7020>
irb(main):003:0> im.getpoint(10, 10)
=> [10.0, 0.0, 3.0]
irb(main):004:0> im.stats
=> #<Vips::Image:0x20d1950 ptr=0x1fb7e30>

您从统计数据中获得的图像的布局在C文档中(ruby-vips是C API上的薄层,因此所有这些文档都可以使用):

http://www.vips.ecs.soton.ac.uk/supported/current/current/doc/html/libvips/libvips-arithmelmelmeltml#vips-stats

因此,您希望RGB平均第4列,第1、2、3行。 getpoint返回一个数组,因此对于一个波段图像,请使用[0]获取第一个元素。

irb(main):007:0> im.stats.getpoint(4, 1)[0]
=> 110.87133688038793
irb(main):008:0> im.stats.getpoint(4, 2)[0]
=> 101.0471090382543
irb(main):009:0> im.stats.getpoint(4, 3)[0]
=> 96.45809502963363

这确实有些笨拙。也许Image应该具有to_a方法?当然,这对于非常小的图像才有意义。

最新更新