2

有没有一种有效的方法可以从 2D NArray(一个应该比常规数组更有效的 Ruby 类)中的数据创建 RMagick 图像,或者这两个库的数据类型不兼容?

下面的代码可以工作,但很难做到:使用嵌套的 do-loop 逐像素转换数据类型。据我所知,这给了我很多额外的工作,但没有 NArray 的优点。它在一月份的运行速度比糖蜜慢:

  def LineaProcessor.createImage(dataArray, width, height, filename)

    image = Magick::Image.new width, height

    # scale pixel values from 0..256*255 (the RMagick pixel uses 16 bits)
    scaling = 65280/dataArray.max

    # set each pixel...I couldn't find any easy way to convert array types
    width.times do |x|
        height.times do |y|
            g = dataArray[x+y*width]*scaling
            pixel = Magick::Pixel.new(g, g, g,0)
            image.pixel_color x, y, pixel 
      end
    end

    image
  end  
4

2 回答 2

0

这是我以前只为灰度执行此操作的一些代码,并且看起来相对较快:

module Convert
  PX_SCALE = ( 2 ** Magick::QuantumDepth  ).to_f

  # Converts 2D NArray of floats 0.0->1.0 to Magick::Image greyscale (16-bit depth)
  def self.narray_to_image na
    raise( ArgumentError, "Input should be NArray, but it is a #{na.class}") unless na.is_a?(NArray)
    raise( ArgumentError, "Input should have 2 dimensions, but it has #{na.dim}" ) unless na.dim == 2
    width, height = na.shape
    img = Magick::Image.new( width, height ) { self.depth = 16; self.colorspace = Magick::GRAYColorspace }
    img.import_pixels(0, 0, width, height, 'I', na.flatten, Magick::DoublePixel )
    img
  end

  # Converts Magick::Image greyscale to 2D NArray of floats 0.0 -> 1.0
  def self.image_to_narray img
    width = img.columns
    height = img.rows
    pixels = NArray.cast( img.export_pixels( 0, 0, width, height, 'I' ).map { |x| x/PX_SCALE } )
    pixels.reshape( width, height )
  end
end

阅读的关键方法是Magick::Image#import_pixelsMagick::Image#export_pixelsNArray.cast

应该可以逐个通道做类似的事情来处理彩色图像。你必须使用浮点数没有根本原因,我只是想要我的目的格式(输入到神经网络)

于 2013-08-01T19:34:31.717 回答
0

您可以像这样将灰度 8 位 NArray 转换为 RMagick 图像

require 'narray'
require 'RMagick'
class NArray
  def to_magick
    retval = Magick::Image.new(*shape) { self.depth = 8 }
    retval.import_pixels 0, 0, *shape, 'I', to_s, Magick::CharPixel
    retval
  end
end
sample = NArray.byte(8, 32).indgen.to_magick
于 2016-02-11T11:02:42.450 回答