2016-03-18 38 views
0

我翻譯用MATLAB製成的功能,從利用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矩陣的顏色強度由一些價值(一)。試圖用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)將不起作用,它會返回相同的圖像。

(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值,等你」只需從pixel.red的值中減去atenuacion,然後對結果無所作爲。試試這個:

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

在上面,pixel.red -= atenuacionpixel.red = pixel.red - atenuacion簡寫。我只是猜測,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) 
+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對負值做了什麼,但即使它將它們限制爲零,這可能不是您期望的結果。 –