我对图像处理完全陌生。我对JPEG内部及其工作原理一无所知。
我想知道,如果我能找到一些执行以下简单操作的ruby代码:
我对使用ruby-vips库如何实现这一点特别感兴趣 https://github.com/ender672/ruby-vips
我的目标 - 学习如何使用ruby-vips(伽马校正,亮度,色调......)执行基本图像处理操作
任何比“hello world”更复杂的工作示例的链接 - 就像ruby-vips的github页面上的链接一样,将非常感谢!
如果有ruby-vips的替代品,我也会感激他们。
更新
自从我提出这个问题以来,已经发生了很多事情:
答案 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问题跟踪器上打开它们:
答案 1 :(得分:1)
对不起,我不知道ruby-vips,但ImageMagick在图像处理方面是经典的。有RMagick(current repo)形式的Ruby绑定,你可以从ImageMagick文档中获得很多功能,但是还有三个教程here,以及一个很多网上的例子。
如果你真的想深入了解图像处理理论,它的根源是信号处理的一种形式(这是非常令人兴奋和有益的,因为它经常允许你在图像上应用非常相似的算法和音频/视频信号,但它最终将在数学上变得非常沉重 - 傅里叶变换),那么,如果数学不会吓到你,我只能建议阅读Gonzalez的book和伍兹,我想说这是该领域的明确参考。它很贵,但是你需要的就是让你开始并远远超越。 Here's还有一个页面,其中包含免费电子书的链接,如果您想在不花费大量金钱的情况下开始使用。