濾鏡sdk,所謂的濾鏡算法如何實現

濾鏡sdk適用的場景有很多,比較常見的有直播、短視頻、特效相機等,而隨着科技的不斷髮展,現代人對照片視頻的色彩和質感方面的要求也越來越高。本文以濾鏡算法爲主要內容來簡單分享下。

灰度濾鏡

常見的彩色圖片有RGB_8888、RGB_565、RGB_4444幾種,每一個像素的顏色值由紅、綠、藍三種值混合而成,紅綠藍的取值也有很多種,而像素的顏色值也有很多顏色值,這可以看作彩色圖片的原理。相反的,灰度圖片只有356中顏色,通常處理過程中是將圖片顏色值的RGB三個通道值設定一樣的,這樣一來原本是256x256x256種顏色就只剩下256種,而256中顏色值就相當於是丟失了圖片的彩色信息,只剩下了亮度值,從人類的視覺上看就是灰色。

在濾鏡sdk中,灰度處理通常有三種算法:

1.最大值——即新的顏色值R=G=B=Max(R,G,B),該方法處理後的圖片或視頻亮度較高。

2.平均值——即新的顏色值R=G=B=(R+G+B)/3,處理後的圖片較柔和。

3.加權平均值——即新的顏色值R=G=B=(RxWr+GxWg+BxWb),由於人眼對不同顏色的敏感度不同,所以三種顏色值的權重也就不同。通常是綠色最高、紅色第二、藍色最低。

for(var i = 0; i < data.length; i+=4) {

     var grey = (data[i] + data[i+1] + data[i+2]) / 3;

     data[i] = data[i+1] = data[i+2] = grey;

}

 (本段代碼僅供參考,不作商用)

黑白濾鏡

其實黑白和灰度還是有一定區別的,灰度有256種顏色,而黑白是隻保留黑白兩種顏色。

可以計算RGB的平均值arg,arg>=100,R=G=B=255,否則均爲0

for(var i = 0; i < data.length; i += 4) {

     var avg = (data[i] + data[i+1] + data[i+2]) / 3;

     data[i] = data[i+1] = data[i+2] = avg >= 100 ? 255 : 0;

}

(本段代碼僅供參考,不作商用)

底片(反向)濾鏡

即將當前像素點的RGB值分別於255之差後的值作爲當前點的RGB值,則R=255-R;G=255-G;B=255-B。

for(var i = 0; i < data.length; i+= 4) {

      data[i] = 255 - data[i];

      data[i + 1] = 255 - data[i + 1];

      data[i + 2] = 255 - data[i + 2];

}

(本段代碼僅供參考,不作商用)

浮雕濾鏡

相比前面幾種濾鏡算法,浮雕濾鏡的算法實現相對比較複雜,用當前點的RGB值減去相鄰點的RGB值並加上128作爲新的RGB 值。因爲圖片中相鄰點的顏色值是比較接近的,所以在做算法處理之後只有顏色的邊沿區域,即相鄰顏色差異較大的部分結果會稍微明顯一些,其他平滑區域值一般在128左右,從而實現浮雕效果。

int preColor = 0;

int prepreColor = 0;

preColor = cbuf[0];

 

int i = 0;

int j = 0;

for (i = 0; i < width; i++)

{

      for (j = 0; j < height; j++)

      {

           int curr_color = cbuf[j * width + i];

           int r = red(curr_color) - red(prepreColor) + 128;

           int g = green(curr_color) - red(prepreColor) + 128;

           int b = green(curr_color) - blue(prepreColor) + 128;

           int a = alpha(curr_color);

 

           int newcolor = (int)(r * 0.3 + g * 0.59 + b * 0.11);

 

           int modif_color = ARGB(a, newcolor, newcolor, newcolor);

           rbuf[j * width + i] = modif_color;

           prepreColor = preColor;

           preColor = curr_color;

      }

}

(本段代碼僅供參考,不作商用)

褐色濾鏡

對顏色進行變換的濾鏡,在此就不多作贅述。採用公式:R=Rx0.393+Gx0.7 69+Bx0.189;G=Rx0.349+Gx0.686+Bx0.168;B=Rx0.272+Gx0.534+Bx0.131。

for (var i = 0; i < imgData.height * imgData.width; i++) {

    var r = imgData.data[i * 4],

        g = imgData.data[i * 4 + 1],

        b = imgData.data[i * 4 + 2];

 

    var newR = r * 0.393 + g * 0.769 + b * 0.189;

    var newG = r * 0.349 + g * 0.686 + b * 0.168;

    var newB =  r * 0.272 + g * 0.534 + b * 0.131;

    var rgbArr = [newR, newG, newB];

    [imgData.data[i * 4], imgData.data[i * 4 + 1], imgData.data[i * 4 + 2]] = rgbArr;

}

(本段代碼僅供參考,不作商用)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章