使用mini_magick或image_science进行图像直方图?

时间:2011-02-09 12:55:47

标签: ruby image-processing rmagick minimagick

是否可以使用mini_magick或image_science获取图像的histogram

我担心mini_magicks使用 mogrify 不允许这样的信息检索。 image_science几乎没有记录,似乎仅限于缩略图缩放和裁剪。

要采取的一种方法是迭代每个像素并在Ruby中提取其值。但这需要有关像素的信息,这也是我在mini_magick中无法达到的。

我可以回退到RMagick或im_magick,但这些要么不那么受欢迎/未知或据说性能不佳。

记录:这是关于找到entropy of parts of images的早期问题的一部分。

3 个答案:

答案 0 :(得分:6)

解决方法是使用mini_magick将文件转换为PNG格式,将结果存储在临时文件中,然后使用“几乎纯粹的Ruby”png library或实际纯粹的Ruby {{3}回顾结果。两个库都可以轻松地逐个像素地迭代图像。

我怀疑你指定了mini_magick / image_science,因为这些比rmagick更容易安装。因此,这个解决方法可能对您有用的原因是png和chunky_png由于缺乏依赖性而无痛苦安装。

你唯一放弃的是一点性能,但如果这是一个真正的问题,chunky_png可以用一些额外的C魔法扩展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本身可以从命令行oily_png。如果你想要一些具体的东西,这可能没有用,但我想我会把它扔出去。

答案 1 :(得分:4)

您可以通过此命令从ImageMagick以直方图格式获取图像:

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

和包含ImageMagick for Ruby的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]

答案 2 :(得分:0)

Mini-magick是imagemagick二进制文件上的一个非常薄的层。如果它不支持Imagemagick的一个选项,则很容易添加。