2016-03-18 3 views
0

Я перевод функции сделали с MATLAB, которая уменьшает интенсивность цвета от сектора изображения к Ruby, используя RMagickУменьшения интенсивности цвета RGB в Руби RMagick

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 по некоторому значению (а). Пытаясь воспроизвести это с рубином кодом дали это:

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

я могу изменить нижнюю треть моего изображения до заданного цвета, в данном примере, в розовый цвет.

Попытка уменьшить каждый компонент на какое-либо значение (atenuacion) с помощью метода каждого цвета не будет работать, он возвращает то же изображение.

(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

ответ

0

Проблема здесь:

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

Вы не изменяя значение pixel.red и т.д. Вы» re просто вычитая atenuacion со значения pixel.red, а затем ничего не делая с результатом. Попробуйте это:

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

В выше, pixel.red -= atenuacion представляет собой сокращенную pixel.red = pixel.red - atenuacion. Я просто догадываюсь, что pixel.red и др. Являются сеттерами, а также геттерами. В противном случае вам может понадобиться сделать что-то вроде этого:

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) 
+0

Благодарим за ответ. Я сделал то, что вы мне сказали, и в настоящее время работает, как вы можете видеть здесь: http://imgur.com/a/8osXN. Он искажает цвета изображения, а не только уменьшает их интенсивность, как вы можете видеть в моем примере с Matlab ... Любые предложения? – marco

+0

Я ничего не знаю о MATLAB, а также о обработке изображений, но этот бит из вашего кода выглядит не так, как вы делаете в Ruby: 'A (i, j, k) = B (i , j, k) - a. Мне кажется, что уменьшение интенсивности цвета пикселя не совпадает с вычитанием того же значения из его красного, зеленого и синего цветов. Например, что, если ваши значения равны * (125, 38, 205) *? Если 'atenuaction' равно 128, результат будет * (- 3, -90, 77) *. Я не знаю, что делает RMagick с отрицательными значениями, но даже если он просто ограничивает их до нуля, это, вероятно, не результат, которого вы ожидали. –

Смежные вопросы