Ruby-vips图像处理库.有没有好用的例子?

Sta*_*ich 5 ruby image-processing vips

我对图像处理完全陌生.我对JPEG内部及其工作原理一无所知.

我想知道,如果我能找到一些执行以下简单操作的ruby代码:

  1. 打开jpeg文件.
  2. 迭代每个像素并将其颜色设置为fx绿色.
  3. 将结果写入另一个文件.

我特别感兴趣的是如何使用ruby-vips库来实现这一点
https://github.com/ender672/ruby-vips

我的目标 - 学习如何使用ruby-vips执行基本图像处理操作(伽马校正,亮度,色调......)

任何链接到比'hello world'更复杂的工作示例 - 就像在ruby-vips的github页面上一样,将非常感谢!

如果有ruby-vips的替代品,我也会感谢他们.


UPDATE

自从我问这个问题以来发生了很多事情:

jcu*_*itt 9

自写这个答案以来,更新 ruby-vips已经改变了一点.我已经修改了当前(2018)版本.

我是libvips的维护者之一,这是ruby-vips包装的图像处理库.

Tim的ruby-vips存储库暂时没有被触及.我在这里有一个与当前libvips一起使用的fork:

https://github.com/jcupitt/ruby-vips

这里有一些例子:

https://github.com/jcupitt/ruby-vips/tree/master/example

要将红色和蓝色通道设置为零并保留绿色图像,可以将R和B乘以零,将G乘以1. ruby​​-vips使用数组表示像素常量,因此您只需编写:

out = in * [0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

完整的可运行示例可能是:

#!/usr/bin/ruby

require 'vips'

im = Vips::Image.new_from_file '/home/john/pics/theo.jpg'
im *= [0, 1, 0]
im.write_to_file 'x.jpg'
Run Code Online (Sandbox Code Playgroud)

你可以使用一个技巧new_from_file:如果你知道你只是在图像上做简单的从上到下的操作,比如算术或过滤或调整大小,你可以告诉ruby-vips你只需要顺序访问像素:

im = Vips::Image.new_from_file '/home/john/pics/theo.jpg', access: :sequential
Run Code Online (Sandbox Code Playgroud)

现在ruby-vips将流式传输您的图像.它将并行地运行加载,乘法和保存,并且在任何时候都不会在内存中保留多个像素扫描线.这可以为速度和内存使用提供非常好的改进.

要更改图像伽玛,您可以尝试以下方法:

im = im ** 0.5 * 255 / 255 ** 0.5
Run Code Online (Sandbox Code Playgroud)

虽然这有点慢(它会为每个像素调用pow()三次),但制作查找表,运行pow(),然后通过表映射图像要快得多:

lut = Vips::Image.identity
lut = lut ** 0.5 * 255 /255 ** 0.5
im = im.maplut lut
Run Code Online (Sandbox Code Playgroud)

如有任何问题,请随时在rubyvips问题跟踪器上打开它们:

https://github.com/jcupitt/ruby-vips/issues

  • 关于ruby-vips与RMagick:vips的优势在于内存使用率会大大降低(例如,在基准测试中高出100倍),速度更快(在该基准测试中为5倍)以及更大,更灵活的范围图像处理操作和像素格式(例如,rmagick仅支持1-5个图像通道,并且与浮点图像相混淆).rmagicks的优点是广泛使用,更全面的文档,以及一组匹配常见用例的内置操作(例如,vips没有内置的porter-duff合成,你需要自己动手). (4认同)