Ruby-vips画像処理ライブラリ。何か良い使用例はありますか?
-
13-12-2019 - |
質問
画像処理に関しては全くの初心者です。JPEG が内部的に何なのか、またそれがどのように機能するのかについては何も知りません。
次のような単純な操作を実行する Ruby コードをどこかで見つけられないかと思います。
- JPEGファイルを開きます。
- 各ピクセルを反復処理し、その色を fx green に設定します。
- 結果を別のファイルに書き込みます。
私は特に、ruby-vips ライブラリを使用してこれをどのように実現できるかに興味があります。
https://github.com/ender672/ruby-vips
私の目標 - Ruby-vips を使用して基本的な画像処理操作 (ガンマ補正、明るさ、色合いなど) を実行する方法を学ぶことです。
Ruby-vips の github ページにある「hello world」のようなものよりも複雑な実際の例へのリンクは、非常に高く評価されます。
Ruby-vips の代替手段があれば、それもありがたいと思います。
アップデート
私がこの質問をして以来、多くのことが起こりました。
- Ruby-vips は素晴らしい逸品です。 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 on Rails 用の CarrierWave アップローダー プラグインへの Ruby-vips の統合: https://github.com/eltiare/carrierwave-vips
- Ruby-vips は、rails6 の ActiveStorage の公式バックエンドの 1 つです
解決
アップデート この回答が書かれてから、ruby-vips は少し変更されました。現在(2018年)版に合わせて改訂しました。
私は、ruby-vips がラップする画像処理ライブラリである libvips のメンテナの 1 人です。
Tim の Ruby-vips リポジトリはしばらく触られていません。現在の libvips で動作するフォークがここにあります。
https://github.com/jcupitt/ruby-vips
ここにいくつかの例があります。
https://github.com/jcupitt/ruby-vips/tree/master/example
赤と青のチャンネルをゼロに設定し、 RとBを掛けるかもしれない緑色の画像 0 と 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() を 3 回呼び出すことになります)、ルックアップ テーブルを作成し、その上で pow() を実行し、そのテーブルを通じて画像をマッピングする方がはるかに高速です。 :
lut = Vips::Image.identity
lut = lut ** 0.5 * 255 /255 ** 0.5
im = im.maplut lut
ご質問がございましたら、お気軽に Rubyvips 問題トラッカーでお問い合わせください。
他のヒント
申し訳ありませんが、ruby-vips についてはわかりませんが、 イメージマジック 画像処理に関しては古典的なものです。次の形式の Ruby バインディングがあります。 Rマジック (現在のリポジトリ)、ImageMagick ドキュメントから多くの機能を派生できますが、3 つのチュートリアルもあります ここ, 、Web 上に多くの例があります。
画像処理の理論を深く掘り下げたい場合は、その根幹は信号処理の一種です (これは非常に刺激的でやりがいがあります。多くの場合、非常に似たアルゴリズムを画像に適用できるからです) そして オーディオ/ビデオ信号ですが、最終的には数学 (フーリエ変換) が非常に重くなります)。数学が怖くないのであれば、このマニュアルを読むことをお勧めします。 本 Gonzalez と Woods の著で、この分野では間違いなく参考になると思います。高価ですが、始めるのに必要なものがすべて揃っています。 こちらです 最初に多額のお金をかけずに始めたい場合は、無料の電子書籍へのリンクがあるページもあります。