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

时间:2012-05-22 20:51:08

标签: ruby image-processing vips

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

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

  1. 打开jpeg文件。
  2. 遍历每个像素并将其颜色设置为fx green。
  3. 将结果写入另一个文件。
  4. 我对使用ruby-vips库如何实现这一点特别感兴趣 https://github.com/ender672/ruby-vips

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

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

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


    更新

    自从我提出这个问题以来,已经发生了很多事情:

2 个答案:

答案 0 :(得分:9)

更新自写回答后,ruby-vips发生了一些变化。我已经修改了当前的(2018)版本。

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

蒂姆的ruby-vips存储库暂时没有被触及。我在这里有一个与当前libvips一起使用的分支:

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]

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

#!/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'

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

im = Vips::Image.new_from_file '/home/john/pics/theo.jpg', access: :sequential

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

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

im = im ** 0.5 * 255 / 255 ** 0.5

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

lut = Vips::Image.identity
lut = lut ** 0.5 * 255 /255 ** 0.5
im = im.maplut lut

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

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

答案 1 :(得分:1)

对不起,我不知道ruby-vips,但ImageMagick在图像处理方面是经典的。有RMagickcurrent repo)形式的Ruby绑定,你可以从ImageMagick文档中获得很多功能,但是还有三个教程here,以及一个很多网上的例子。

如果你真的想深入了解图像处理理论,它的根源是信号处理的一种形式(这是非常令人兴奋和有益的,因为它经常允许你在图像上应用非常相似的算法音频/视频信号,但它最终将在数学上变得非常沉重 - 傅里叶变换),那么,如果数学不会吓到你,我只能建议阅读Gonzalez的book和伍兹,我想说这是该领域的明确参考。它很贵,但是你需要的就是让你开始并远远超越。 Here's还有一个页面,其中包含免费电子书的链接,如果您想在不花费大量金钱的情况下开始使用。