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

ber*_*kes 2 ruby rmagick image-processing minimagick

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

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

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

我可以回退到RMagick或im_magick,但这些要么不那么流行/未知,要么据说性能不好.

为了记录:这是关于找到部分图像的早期问题的一部分.

Pet*_*per 6

解决方法是使用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
Run Code Online (Sandbox Code Playgroud)

您可以从那里获取直方图创建部分;-)

另外,我刚注意到ImageMagick本身可以从命令行创建直方图.如果你想要一些具体的东西,这可能没有用,但我想我会把它扔出去.


小智 5

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

convert penguinsonice.bmp -format %c histogram:info:
Run Code Online (Sandbox Code Playgroud)

以及为 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]
Run Code Online (Sandbox Code Playgroud)