Библиотека обработки изображений Ruby-vips. Есть ли хорошие примеры использования?

Я совершенно новичок в обработке изображений. Я ничего не знаю о том, что такое JPEG внутри и как он работает.

Интересно, могу ли я найти где-нибудь кусок рубинового кода, выполняющего следующую простую операцию:

  1. Откройте jpeg-файл.
  2. Переберите каждый пиксель и установите его цвет на fx зеленый.
  3. Записать результат в другой файл.

Меня особенно интересует, как это можно сделать с помощью библиотеки ruby-vips
https://github.com/ender672/ruby-vips

Моя цель - научиться выполнять базовые операции по обработке изображений с помощью ruby-vips (гамма-коррекция, яркость, оттенок,...)

Будем очень признательны за любые ссылки на рабочие примеры, более сложные, чем «hello world» на странице github ruby-vips!

Если есть альтернативы ruby-vips, я тоже был бы благодарен за них.


ОБНОВЛЕНИЕ

Многое произошло с тех пор, как я задал этот вопрос:


person Stanislav Pankevich    schedule 22.05.2012    source источник
comment
ruby-vips выглядит заброшенным на github. Имейте это в виду, особенно если вы хотите использовать более поздние версии ruby.   -  person d11wtq    schedule 23.05.2012
comment
Рабочее дерево находится на github.com/jcupitt/ruby-vips. Также ruby-vips был выпущен на rubygems: rubygems.org/gems/ruby-vips   -  person Stanislav Pankevich    schedule 22.06.2012
comment
Спасибо. На самом деле выглядит неплохо. Придется с ним поиграться. Нам действительно нужно что-то, что позволяет рисовать на холсте (в настоящее время мы склоняемся к Cairo для этого)... Хотелось бы, чтобы было больше доступных (таких как это), когда дело доходит до обработки изображений в ruby.   -  person d11wtq    schedule 22.06.2012


Ответы (2)


update 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

person jcupitt    schedule 23.05.2012
comment
Что касается ruby-vips по сравнению с RMagick: преимущества vips будут заключаться в гораздо меньшем использовании памяти (например, в 100 раз по сравнению с вышеприведенным тестом), намного быстрее (в 5 раз по этому тесту) и в большем и более гибком диапазоне. операций обработки изображений и форматов пикселей (например, rmagick поддерживает только 1–5 каналов изображения и борется с изображениями с плавающей запятой). Преимущества rmagicks заключаются в широком использовании, гораздо более полной документации и наборе встроенных операций, которые соответствуют распространенным вариантам использования (например, в vips нет встроенного композитинга портера-даффа, вам нужно накатить свой собственный). - person jcupitt; 23.05.2012
comment
Возможно, мне придется изучить исправление CarrierWave, чтобы использовать его в качестве альтернативы RMagick. Я не очень люблю RMagick, и это выглядит лучше, спасибо. - person d11wtq; 22.06.2012

Извините, я не знаком с ruby-vips, но ImageMagick — это классика. когда дело доходит до обработки изображений. Существуют привязки Ruby в виде RMagick (текущий репозиторий), и вы можете получить множество функций из документации ImageMagick, но есть также три руководства здесь, а также множество примеров в Интернете.

Если вы действительно хотите углубиться в теорию обработки изображений, которая по своей сути является формой обработки сигналов (это очень увлекательно и полезно, поскольку часто позволяет применять очень похожие алгоритмы к изображениям и аудио/видеосигналы, но в конечном итоге это будет очень тяжело для математики - преобразования Фурье), тогда, если математика вас не пугает, я могу только порекомендовать прочитать book Гонсалеса и Вудса, я бы сказал, что это несомненный справочник в этой области. Это дорого, но в нем есть все, что вам нужно, чтобы начать работу и даже больше. Вот также страница со ссылками на бесплатные электронные книги, если вы хотите начать, не тратя сначала много денег.

person emboss    schedule 22.05.2012