Ruby-vips图像处理库。有哪些使用示例?

7
我完全不了解图像处理。我不知道JPEG内部是什么,以及它的工作原理。
我想知道是否有Ruby代码片段可以执行以下简单操作:
1. 打开JPEG文件。 2. 遍历每个像素并将其颜色设置为绿色。 3. 将结果写入另一个文件。
我特别想知道如何使用ruby-vips库完成此操作。https://github.com/ender672/ruby-vips 我的目标是学习如何使用ruby-vips执行基本的图像处理操作(伽马校正,亮度,色调等)。
任何比 ruby-vips 的 GitHub 页面上的“hello world”示例更复杂的工作示例的链接都将不胜感激!
如果有其他替代品,我也会感激不尽。
更新:
自从我提出这个问题以来,发生了很多事情:
- ruby-vips 是一个 gem:http://libvips.blogspot.co.uk/2012/06/ruby-vips-launches.html - 完全重写 vips8,现在基于 ruby-ffi - 源代码存储库在此处:https://github.com/jcupitt/ruby-vips/ - 使用示例:https://github.com/jcupitt/ruby-vips/wiki/Examples - vips 图像处理的基本概念:https://github.com/jcupitt/ruby-vips/wiki/Basic-concepts - ruby-vips 集成到 Ruby on Rails 的 CarrierWave 上载程序插件中:https://github.com/eltiare/carrierwave-vips - ruby-vips 是 rails6 的 ActiveStorage 官方后端之一。

ruby-vips 在 GitHub 上看起来已经被放弃了。特别是如果您想使用较新版本的 Ruby,请记住这一点。 - d11wtq
工作树位于 https://github.com/jcupitt/ruby-vips 上。同时,ruby-vips 已发布到 rubygems:http://rubygems.org/gems/ruby-vips - Stanislav Pankevich
谢谢。实际上看起来很不错。我们需要尝试一下。我们真的需要能够在画布上绘制的东西(目前我们倾向于使用Cairo)...我希望在Ruby中进行图像处理时有更多类似这样的可用选项。 - d11wtq
2个回答

10

更新:自此答案编写以来,ruby-vips 已经有了一些变化。我已经针对当前(2018)版本进行了修订。

我是 libvips 图像处理库的维护者之一,而 ruby-vips 则是基于该库开发的。

Tim 的 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将会流式处理你的图像。它将同时运行加载、乘法和保存操作,并始终在内存中保留少量扫描线像素。这可以显著提高处理速度并节省内存使用。

要改变图像的Gamma值,你可以尝试类似以下的操作:

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


4
关于ruby-vips与RMagick的比较:vips的优势在于使用内存更少(例如,在上述基准测试中相差100倍),速度更快(在该基准测试中相差5倍),并且具有更广泛、更灵活的图像处理操作和像素格式(例如,rmagick仅支持1-5个图像通道,并且难以处理浮点图像)。而RMagick的优势在于被广泛使用,文档更加全面,以及一套内置操作可以匹配常见用例(例如,vips没有内置的porter-duff合成,需要自己实现)。 - jcupitt
我可能需要研究一下如何修补CarrierWave,以将其作为RMagick的替代方案。我对RMagick并不是很喜欢,这个看起来更好,谢谢。 - d11wtq

2

抱歉,我不了解ruby-vips,但是在图像处理方面,ImageMagick是个经典工具。它有 Ruby 绑定库 RMagick当前存储库),您可以从 ImageMagick 文档中获取很多功能,并且还有三个教程在这里,以及网络上的许多示例。

如果您真的想深入研究图像处理理论,这在其根源上是一种信号处理形式(非常令人兴奋和有益,因为它通常允许您在图像和音频/视频信号上应用非常相似的算法,但最终将变得非常重视数学 - 傅立叶变换),那么,如果您不怕数学,我强烈建议阅读Gonzalez和Woods的书籍,我会说这是这个领域的定义参考。它很贵,但里面有你需要开始和深入了解的所有内容。如果您想先不花太多钱就开始,请参阅这里 的免费电子书链接页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接