首頁  >  文章  >  後端開發  >  Ruby實現的圖片濾鏡演算法程式碼

Ruby實現的圖片濾鏡演算法程式碼

小云云
小云云原創
2017-12-05 14:38:251670瀏覽

濾鏡現在在我們的生活中運用很廣泛,在開發中我們也會觸及到,本文給大家分享的是使用ruby實現的幾種圖片濾鏡的演算法,包括灰階、二值、底片、浮雕。非常的簡單實用,有需要的夥伴可以參考下。

原圖


一、灰階演算法

彩色照片每一個像素的顏色值由紅、綠、藍三種值混合而成,紅綠藍的取值分別由很多種,於是像素的顏色值也可以有很多種顏色值,這就是彩色圖片的原理,而灰度照片則只有256種顏色,一般的處理方法是將圖片顏色值的RGB三個頻道值設為一樣,這樣圖片的顯示效果就會是灰色。

灰階處理一般有三種演算法:

  1. 最大值法:即新的顏色值R=G=B=Max(R,G,B),這種方法處理後的圖片看起來亮度值偏高。

  2. 平均值法:即新的顏色值R=G=B=(R+G+B)/3,這樣處理的圖片十分柔和

  3. #加權平均值法:即新的顏色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由於人眼對不同顏色的敏感度不一樣,所以三種顏色值的權重不一樣,一般來說綠色最高,紅色其次,藍色最低,最合理的值分別為Wr = 30%,Wg = 59%,Wb = 11%

#下面是加權平均值法的Ruby實作:


 #灰度化图片
 #取RGB三色平均值
 def self.grey(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    grey = rgb.r.to_f * 0.3+rgb.g.to_f *0.59 +rgb.b.to_f * 0.11.to_i
    bmp.setRGB(i, j, RGB.new(grey, grey, grey))
   end
  end
 end

#灰階效果:


二、二值化

影像二值化就是將影像上的像素點的灰階值設為0或255,也就是將整個影像呈現出明顯的黑白效果。所有灰階大於或等於閾值的像素被判定為屬於特定物體,其灰階值為255表示,否則這些像素點被排除在物體區域以外,灰階值為0,表示背景或例外的物體區域。

圖像二值化常用於破解驗證碼等圖片辨識應用程式上

#
#二值化图片
 #小于一定阈值设为0 0 0,大于设置为255 255 255
 def self.binarization(bmp)
  imageGreyLevel = bmp.getGreyLevel
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    if rgb.getGreyLevel<imageGreyLevel
     bmp.setRGB(i, j, RGB.new(0, 0, 0))
    else
     bmp.setRGB(i, j, RGB.new(255, 255, 255))
    end
   end

  end
 end

二值化效果


 三、底片

#底片效果的實作很簡單,就是將RGB的每一個通道值取反,就是用255去減

#底片化图片
 #RGB取反色255-
 def self.contraryColor(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    bmp.setRGB(i, j, rgb.getContrary)
   end
  end
 end

底片效果




##浮雕的演算法相對複雜一些,用當前點的RGB值減去相鄰點的RGB值並加上128作為新的RGB值。由於圖片中相鄰點的顏色值是比較接近的,因此這樣的演算法處理之後,只有顏色的邊緣區域,也就是相鄰顏色差異較大的部分的結果才會比較明顯,而其他平滑區域則值都接近128左右,也就是灰色,這樣

就具有了浮雕效果。 在實際的效果中,這樣處理後,有些區域可能還是會有」彩色」的一些點或條狀痕跡,所以最好再對新的RGB值做一個灰階處理。

#浮雕效果
 #浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,
 #因此这样的算法 处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,
 #也就是灰色,这样就具有了浮雕效果。
 #在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。
 def self.emboss(bmp)

  preRGB=RGB.new(128, 128, 128)

  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    currentRGB=bmp.getRGB(i, j)
    r=(currentRGB.r-preRGB.r)*1+128
    g=(currentRGB.g - preRGB.g)*1+128
    b=(currentRGB.b-preRGB.b)*1+128

    bmp.setRGB(i, j, RGB.new(r,g,b).getGreyRGB)
    preRGB = currentRGB
   end
  end

 end

浮雕效果

#######以上內容就是關於Ruby實作的圖片濾鏡演算法程式碼,希望對大家有幫助。 ######相關建議:#########談談CSS濾鏡的詳細介紹################CSS3實作濾鏡效果的實例詳解# ###########HTML5實作一個圖片濾鏡效果的範例程式碼分享#######

以上是Ruby實現的圖片濾鏡演算法程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn