Ruby實(shí)現(xiàn)的圖片濾鏡算法代碼
原圖

一、灰度算法
彩色照片每一個(gè)像素的顏色值由紅、綠、藍(lán)三種值混合而成,紅綠藍(lán)的取值分別由很多種,于是像素的顏色值也可以有很多種顏色值,這就是彩色圖片的原理,而灰度照片則只有256種顏色,一般的處理方法是將圖片顏色值的RGB三個(gè)通道值設(shè)為一樣,這樣圖片的顯示效果就會(huì)是灰色。
灰度處理一般有三種算法:
- 最大值法:即新的顏色值R=G=B=Max(R,G,B),這種方法處理后的圖片看起來亮度值偏高。
- 平均值法:即新的顏色值R=G=B=(R+G+B)/3,這樣處理的圖片十分柔和
- 加權(quán)平均值法:即新的顏色值R=G=B=(R * Wr+G*Wg+B*Wb),一般由于人眼對(duì)不同顏色的敏感度不一樣,所以三種顏色值的權(quán)重不一樣,一般來說綠色最高,紅色其次,藍(lán)色最低,最合理的取值分別為Wr = 30%,Wg = 59%,Wb = 11%
下面是加權(quán)平均值法的Ruby實(shí)現(xiàn):
#灰度化圖片
#取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
灰度效果:

二、二值化
圖像二值化就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果。所有灰度大于或等于閾值的像素被判定為屬于特定物體,其灰度值為255表示,否則這些像素點(diǎn)被排除在物體區(qū)域以外,灰度值為0,表示背景或者例外的物體區(qū)域。
圖像二值化常常用于破解驗(yàn)證碼等圖片識(shí)別應(yīng)用上
#二值化圖片
#小于一定閾值設(shè)為0 0 0,大于設(shè)置為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
二值化效果

三、底片
底片效果的實(shí)現(xiàn)很簡單,就是將RGB的每一個(gè)通道值取反,就是用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
底片效果

四、浮雕效果
浮雕的算法相對(duì)復(fù)雜一些,用當(dāng)前點(diǎn)的RGB值減去相鄰點(diǎn)的RGB值并加上128作為新的RGB值。由于圖片中相鄰點(diǎn)的顏色值是比較接近的,因此這樣的算法處理之后,只有顏色的邊沿區(qū)域,也就是相鄰顏色差異較大的部分的結(jié)果才會(huì)比較明顯,而其他平滑區(qū)域則值都接近128左右,也就是灰色,這樣
就具有了浮雕效果。
在實(shí)際的效果中,這樣處理后,有些區(qū)域可能還是會(huì)有”彩色”的一些點(diǎn)或者條狀痕跡,所以最好再對(duì)新的RGB值做一個(gè)灰度處理。
#浮雕效果
#浮雕的算法相對(duì)復(fù)雜一些,用當(dāng)前點(diǎn)的RGB值減去相鄰點(diǎn)的RGB值并加上128作為新的RGB值。由于圖片中相鄰點(diǎn)的顏色值是比較接近的,
#因此這樣的算法 處理之后,只有顏色的邊沿區(qū)域,也就是相鄰顏色差異較大的部分的結(jié)果才會(huì)比較明顯,而其他平滑區(qū)域則值都接近128左右,
#也就是灰色,這樣就具有了浮雕效果。
#在實(shí)際的效果中,這樣處理后,有些區(qū)域可能還是會(huì)有”彩色”的一些點(diǎn)或者條狀痕跡,所以最好再對(duì)新的RGB值做一個(gè)灰度處理。
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
浮雕效果

項(xiàng)目主頁
相關(guān)文章
Java 版的 Ruby 解釋器 JRuby 1.7.14 發(fā)布
JRuby,一個(gè)采用純Java實(shí)現(xiàn)的Ruby解釋器,由JRuby團(tuán)隊(duì)開發(fā)。它是一個(gè)自由軟件,在CPL/GPL/LGPL三種許可協(xié)議下發(fā)布。2014-08-08
Ruby中一些基本語法知識(shí)點(diǎn)的羅列匯總
這篇文章主要介紹了Ruby中一些基本語法知識(shí)點(diǎn)的羅列匯總,包括Ruby中的注釋和標(biāo)識(shí)符等基礎(chǔ)內(nèi)容,需要的朋友可以參考下2015-05-05
深入剖析Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用
這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中對(duì)命令模式的相關(guān)使用,文中還講到了關(guān)于觀察者模式和命令模式的一些概念區(qū)別,需要的朋友可以參考下2016-04-04
Ruby中執(zhí)行Linux shell命令的六種方法詳解
這篇文章主要介紹了Ruby中執(zhí)行Linux shell命令的六種方法詳解,這些方法包括exec、system、反引號(hào)、IO、Open3、Open4等命令,需要的朋友可以參考下2015-01-01
淺談Ruby on Rails下的rake與數(shù)據(jù)庫數(shù)據(jù)遷移操作
Rails中的Migration相對(duì)來說更適合做數(shù)據(jù)庫的對(duì)象集合操作,而自動(dòng)化的rake則是一個(gè)較好的選擇,下面來淺談Ruby on Rails下的rake與數(shù)據(jù)庫數(shù)據(jù)遷移操作,需要的朋友可以參考下2016-06-06

