2

是否可以使用 mini_magick 或 image_science 获取图像的直方图?

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

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

我可以回退到 RMagick 或 im_magick,但它们要么不那么受欢迎/不为人知,要么据报道性能不佳。

记录在案:这是关于查找图像部分熵的早期问题的一部分。

4

3 回答 3

7

一种解决方法是使用 mini_magick 将文件转换为 PNG 格式,将结果存储在临时文件中,然后使用“几乎纯 Ruby” png 库或实际纯 Ruby chunky_png来检查结果。这两个库都可以轻松地逐个像素地迭代图像。

我怀疑您指定了 mini_magick/image_science,因为它们比 rmagick 更容易安装。那么,此解决方法可能对您有用的原因是 png 和 chunky_png 由于缺乏依赖关系而可以轻松安装。

你唯一要放弃的是一点性能,但如果这是一个真正的问题,oily_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 本身可以从命令行创建直方图。如果您想要特定的东西,这可能无济于事,但我想我会把它扔在那里。

于 2011-02-25T06:46:47.407 回答
5

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

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

以及为 Ruby 包装 ImageMagick 的 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 的选项之一,则很容易添加。

于 2011-02-24T21:31:09.887 回答