2

mini_magickまたはimage_scienceで画像のヒストグラムを取得することは可能ですか?

mini_magicksでmogrifyを使用すると、そのような情報を取得できなくなります。image_scienceはほとんど文書化されておらず、サムネイルのスケーリングとトリミングのみに制限されているようです。

取るべき1つのルートは、Rubyで各ピクセルを反復処理し、その値を抽出することです。しかし、それにはピクセルに関する情報が必要であり、mini_magickでも取得できません。

RMagickまたはim_magickのいずれかにフォールバックできますが、これらはあまり人気がないか不明であるか、パフォーマンスが悪いと報告されています。

記録のために:これは、画像の一部のエントロピーを見つけることについての以前の質問の一部です。

4

3 に答える 3

7

回避策は、mini_magickを使用してファイルをPNG形式に変換し、結果を一時ファイルに保存してから、「ほぼ純粋なRuby」pngライブラリまたは実際に純粋なRubychunky_pngを使用して結果を確認することです。どちらのライブラリでも、画像をピクセルごとに簡単に繰り返すことができます。

mini_magick / image_scienceを指定したのではないかと思います。これは、たとえばrmagickよりもインストールがはるかに簡単だからです。この回避策がうまくいく理由は、依存関係がないため、pngとchunky_pngが痛みのないインストールであるためです。

諦めるのは少しのパフォーマンスだけですが、それが本当の問題である場合、 oily_pngはchunky_pngを拡張してCの魔法を追加することができます。コンパイルはありますが、面倒なことではありません。

OK、私はこれのために機能するいくつかのコードを思いついた:

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自体がコマンドラインからヒストグラムを作成できることに気づきました。特定の何かが必要な場合、これは役に立たないかもしれませんが、私はそれをそこに捨てると思いました。

于 2011-02-25T06:46:47.407 に答える
5

次のコマンドで、ImageMagickからヒストグラム形式の画像を取得できます。

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

そして、ImageMagick forRubyをラップするgem'mini_magick'のコード:

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]
于 2014-03-06T08:22:32.320 に答える
0

Mini-magickは、imagemagickバイナリの上の非常に薄いレイヤーです。Imagemagickのオプションの1つをサポートしていない場合は、簡単に追加できます。

于 2011-02-24T21:31:09.887 に答える