Гистограмма изображения с помощью mini_magick или image_science? - PullRequest
2 голосов
/ 09 февраля 2011

Можно ли получить гистограмму изображения с помощью mini_magick или image_science?

Боюсь, использование mini_magicks mogrify не позволяет получать такую ​​информацию. image_science вряд ли документирована и, похоже, ограничивается только масштабированием и обрезкой миниатюр.

Один из возможных путей - перебирать каждый пиксель и извлекать его значения в Ruby. Но для этого требуется информация о пикселях, которую я не могу найти в mini_magick.

Я могу вернуться к RMagick или im_magick, но они либо менее популярны / неизвестны, либо, по сообщениям, имеют плохую производительность.

Для справки: это часть предыдущего вопроса о нахождении энтропии частей изображений .

Ответы [ 3 ]

6 голосов
/ 25 февраля 2011

Обходной путь - использовать mini_magick для преобразования файла в формат PNG, сохранить результат во временном файле, а затем использовать «почти чистую Ruby» png библиотеку или фактически чистый Ruby chunky_png чтобы просмотреть результат. Обе библиотеки позволяют легко перебирать изображение пиксель за пикселем.

Я подозреваю, что вы указали mini_magick / image_science, потому что их намного проще установить, чем, скажем, rmagick. Поэтому этот обходной путь может помочь вам в том, что png и chunky_png устанавливаются безболезненно из-за отсутствия зависимостей.

Единственное, от чего вы бы отказались - это небольшая производительность, но если это реальная проблема, oily_png может расширить chunky_png с помощью некоторой дополнительной магии Си ... так что будет компиляция, но не должно быть болезненным.

ОК, я придумал код для этого, который работает:

require 'mini_magick'
require 'chunky_png'

i = MiniMagick::Image.open("a.jpg")

i.format('png')

p = ChunkyPNG::Image.from_io(StringIO.new(i.to_blob))

p.height.times do |y|
  p.width.times do |x|
    p[x, y]  # => here's your pixel..
  end
end

Оттуда вы можете взять часть создания гистограммы; -)

Кроме того, я только что заметил, что сам ImageMagick может создавать гистограммы из командной строки. Это может не помочь, если вы хотите что-то конкретное, но я подумал, что выкину это туда.

4 голосов
/ 06 марта 2014

Вы можете получить изображение в формате гистограммы из ImageMagick с помощью этой команды:

convert penguinsonice.bmp -format %c histogram:info:

и кода для gem 'mini_magick', обертывающего ImageMagick для Ruby:

require "mini_magick"

module MiniMagick
 class Image
  def get_dominant_color
   color = run_command("convert", path, "-format", "%c\n",  "-colors", 1, "-depth", 8, "histogram:info:").split(' ');
   # color = "   1764000: (208,195,161) #D0C3A1 srgb(208,195,161)\n\n"
   {
     hex: color[2], 
     rgb: color[1][1..-2].split(',')
   }
  end
 end
end


i = MiniMagick::Image.open("/home/a.jpg")

p i.get_dominant_color()[:hex]
p i.get_dominant_color()[:rgb]
0 голосов
/ 25 февраля 2011

Мини-магия - это очень тонкий слой поверх бинарного изображения.Если он не поддерживает один из параметров Imagemagick, его легко добавить.

...