使用 Rmagick 降低 Ruby 中的 RGB 颜色强度

Reducing RGB color intensity in Ruby with Rmagick

我正在翻译一个使用 MATLAB 制作的函数,该函数使用 Rmagick

将图像扇区的颜色强度降低到 Ruby
for i=round(f/3):f 
        for j=1:round(c)
            for k=1:p
            A(i,j,k) = B(i,j,k) - a;
            end
        end
    end

    for i=1:round(2*f/3)

这将所有 3 个 RGB 矩阵的颜色强度降低了某个值 (a)。尝试用 ruby 代码重现此结果:

(0..imagen.columns).each do |x|
  ((2 * imagen.rows) / 3..imagen.rows).each do |y|
    imagen.pixel_color(x, y, 'pink')
  end
end

我可以将图像的下三分之一更改为设置颜色,在本例中为粉红色。

尝试使用每种颜色的方法将每个分量减少某个值 (atenuacion) 是行不通的,它 returns 是同一幅图像。

(0..imagen.columns).each do |x|
  ((2 * imagen.rows) / 3..imagen.rows).each do |y|
    pixel = imagen.pixel_color(x, y)
    pixel.red - atenuacion
    pixel.green - atenuacion
    pixel.blue - atenuacion
    imagen.pixel_color(x, y, pixel)
  end
end

欢迎任何提示或建议,提前致谢:D

问题出在这里:

pixel.red - atenuacion
pixel.green - atenuacion
pixel.blue - atenuacion

您没有更改 pixel.red 的值,等等。您只是从 pixel.red 的值中减去 atenuacion,然后不对结果执行任何操作。试试这个:

pixel.red -= atenuacion
pixel.green -= atenuacion
pixel.blue -= atenuacion

在上面,对于pixel.red = pixel.red - atenuacionpixel.red -= atenuacion是shorthand。我只是猜测 pixel.red 等人既是 setter 也是 getter。如果没有,您可能需要改为执行以下操作:

pixel = imagen.pixel_color(x, y)

new_color = Magick::Pixel.new(
              pixel.red - atenuacion,
              pixel.green - atenuacion,
              pixel.blue - atenuacion,
              pixel.opacity)

imagen.pixel_color(x, y, new_color)