1. 程式人生 > >Android影象處理之色彩特效處理(學習筆記)

Android影象處理之色彩特效處理(學習筆記)

彩色特效處理

1.色彩矩陣分析

在色彩處理中,通常用以下三個角度來描述一個影象。

  • 色調——物體傳播的顏色
  • 飽和度——顏色的純度,從0(灰)到100%(飽和)來進行描述
  • 亮度——顏色的相對明暗程度
    在Android中,系統使用一個顏色矩陣——ColorMatrix,來處理影象的這些色彩效果。Android中的顏色矩陣是一個4×5的數字矩陣,它用來對圖片的色彩進行處理。而對於每個畫素點,都有一個顏色分量矩陣用來儲存顏色的RGBA值,如下圖所示:
    A=afkpbglqchmrdinsejotC=RGBA1
    在這個4×5的顏色矩陣中按以下方式劃分。
  • 第一行的abcde值用來決定新的顏色值中的R——紅色
  • 第二行的fghij值用來決定新的顏色值中的G——綠色
  • 第三行的klmno值用來決定新的顏色值中的B——藍色
  • 第四行的pqrst值用來決定新的顏色值中的A——透明度
  • 矩陣A中的第五列——ejot值分別用來決定每個分量重的offset,即偏移量。

1.1 改變偏移量

A=10000100001000010000A=100001000010000110010000
在這個矩陣中修改了R,G所對應的顏色偏移量,那麼最後的處理結果就是影象的紅色,綠色分量增加了100.而我們知道,紅色混合綠色會得到黃色,所以使得整個影象的色調偏黃色。

1.2 改變顏色系數

A=10000200001000010000
在這個矩陣中,改變了G分量所對應的係數g,這樣的矩陣運算後G分量會變成以前的兩倍,最終效果就是影象的色調更加偏綠。

1.3 改變色光屬性

影象的色調,飽和度,亮度這三個屬性在影象處理中的使用非常多,因此顏色矩陣中,也封裝了一些API來快速呼叫這些引數,而不用每次都去計算矩陣的值。
在Android中,系統封裝了一個類——ColorMatrix,也就是說前面的顏色矩陣。通過這個類,可以很方便地改變矩陣值來處理顏色效果。

ColorMatrix colorMatrix = new ColorMatrix();
  • 色調
    Android系統提供了setRotate(int axis, float degree)來幫助我們設定顏色的色調。第一個引數,系統分別使用0、1、2來代表Red、Green、Blue三種顏色的處理;而第二個引數,就是需要處理的值,程式碼如下:
ColorMatrix hueMatrix = new ColorMatrix();
hueMatrix .setRotate(0,hue0);
hueMatrix .setRotate(1,hue1);
hueMatrix .setRotate(2,hue2);

通過這樣的方法可以為RGB三種顏色分量分別重新設定不同的色調值。

  • 飽和度
    Android系統提供了setSaturation(float sat)方法來設定顏色的飽和度,引數代表設定顏色飽和度的值,當飽和度為0時,影象就變成灰度影象了。
ColorMatrix saturationMatrix=new ColorMatrix();
saturationMatrix.setSaturation(saturation);
  • 亮度
    當三原色以相同的比例進行混合的時候,就會顯示出白色,系統正式使用這個原理來改變一個影象的亮度的,程式碼如下,當亮度為0時,影象就變成全黑了。
ColorMatrix lumMatrix=new ColorMatrix();
lumMatrix.setScale(lum,lum,lum,1);

除了單獨使用上面三種方式來進行顏色效果的處理之外,Android系統還封裝了矩陣的乘法運算。它提供了postConcat()方法來將矩陣的作用效果混合,從而疊加處理效果,程式碼如下:

ColorMatrix imageMatrix=new ColorMatrix();
imageMatrix.posConcat(hueMatrix);
imageMatrix.posConcat(saturationMatrix);
imageMatrix.posConcat(lumMatrix);

最後通過paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix))設定給paint,並使用這個畫筆來繪製原來的影象,從而將顏色矩陣作用到原圖上。

paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
canvas.drawBitmap(bitmap,0,0,paint);

2. 常用影象顏色矩陣處理效果

2.1 灰度效果

0.33f,0.59f,0.11f,0, 0,
0.33f,0.59f,0.11f,0, 0,
0.33f,0.59f,0.11f,0, 0,
0,    0,    0,    1, 0,

2.2 影象反轉

-1, 0, 0, 1, 1,
 0,-1, 0, 1, 1,
 0, 0,-1, 1, 1,
 0, 0, 0, 1, 0,

2.3 懷舊效果

0.393f,0.769f,0.189f,0, 0,
0.349f,0.686f.0.168f,0, 0,
0.242f,0.534f,0.131f,0, 0,
0,     0,     0,     0, 0,

2.4 去色效果

1.5f, 1.5f, 1.5f, 0, -1,
1.5f, 1.5f, 1.5f, 0, -1,
1.5f, 1.5f, 1.5f, 0, -1,
0,    0,    0,    1,  0,

2.5 高飽和度

 1.438f,-0.122f,-0.016f, 0,-0.03f,
-0.062f, 1.378f,-0.016f, 0, 0.05f,
-0.062f,-0.122f, 1.483f, 0,-0.02f
 0,      0,      0,      1, 0,

3. 畫素點分析

作為更加精確的影象處理方式,可以通過改變每個畫素點的具體ARGB值,來達到處理一張影象效果的目的。需要注意的是,傳遞進來的原始圖片是不能修改的,一般根據原始圖片生成一張新的圖片來修改。
在Android中,系統提供了Bitmap.getPixels()方法來幫我們提取整個Bitmap中的畫素點,並儲存到一個數組中。

bitmap.getPixels(pixels,offset,stride,x,y,width,height);

這幾個引數的含義如下:

  • pixels——接收點陣圖顏色值的陣列
  • offset——寫入到pixels[]中的第一個畫素索引值
  • stride——pixels[]中的行間距
  • x——從點陣圖中讀取的第一個畫素的x座標值
  • y——從點陣圖中讀取的第一個畫素的y座標值
  • width——從每一行中讀取的畫素寬度
  • height——讀取的行數
    通常情況下,可以使用如下程式碼:
bitmap.getPixels(oldPx,0,bm.getWidth(),0,0,width,height);

接下來就可以獲取每個畫素具體的ARGB了,如下:

color=oldPx[i];
r=Color.red(color);
g=Color.green(color);
b=Color.blue(color);
a=Color.alpha(color);

當獲取到具體的顏色值後,就可以通過相應的演算法來修改它的ARGB值。如下老照片效果效果:

r1=(int)(0.393*r+0.769*g+0.189*b);
g1=(int)(0.349*r+0.686*g+0.168*b);
b1=(int)(0.272*r+0.534*g+0.131*b);

再通過如下程式碼將新的RGBA值合成畫素點:

newPx[i]=Color.argb(a,r1,g1,b1);

最後通過如下程式碼,將處理後的畫素點陣列重新set給我們的Bitmap,從而達到影象處理的目的。

bitmap.setPixels(newPx,0,width,0,0,width,height);

4. 常用畫素畫素點處理效果

4.1 底片效果

若存在ABC3個畫素點,要求B點對應的底片效果演算法,程式碼如下:

B.r=255-B.r;
B.g=255-B.g;
B.b=255-B.b;

實現程式碼如下:

public static Bitmap handleImageNegative(Bitmap bm){
    int width = bm.getWidth();
    int height - bm.getHeight();
    int color;
    int r,g,b,a;

    Bitmap bmp=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);

    int[]oldPx=new int[width * height];
    int[]newPx=new int[width * height];
    bm.getPixels(oldPx,0,width,0,0,width,height);

    for(int i=0;i<width * height;i++){
        color=oldPx[i];
        r=Color.red(color);
        g=Color.green(color);
        b=Color.blue(color);
        a=Color.alpha(color);
        //
        r=255-r;
        g=255-g;
        b=255-b;

        if(r>255){
            r=255;
        }else if(r<0){
            r=0;
        }   
        if(g>255){
            g=255;
        }else if(g<0){
            g=0;
        }
        if(b>255){
            b=255;
        }else if(b<0){
            b=0;
        }
        newPx[i]=Color.argb(a,r,g,b);
    }
    bmp.setPixels(newPx,0,width,0,0,widht,height);
    return bmp;
}

4.2 老照片效果

求某畫素點的老照片效果演算法,程式碼如下:

r1=(int)(0.393*r+0.769*g+0.189*b);
g1=(int)(0.349*r+0.686*g+0.168*b);
b1=(int)(0.272*r+0.534*g+0.131*b);

4.3 浮雕效果

若存在ABC3個畫素點,要求B點對應的浮雕效果演算法,程式碼如下:

B.r=C.r-B.r+127;
B.g=C.g-B.g+127;
B.b=C.b-B.b+127;

5. 圖形特效處理

5.1 Android變形矩陣——Matrix

對於影象的圖形變換,Android系統也通過矩陣來進行處理。Android的圖形變換矩陣是一個3×3的矩陣,如下:

A=adg

相關推薦

Android影象處理色彩特效處理(學習筆記)

彩色特效處理 1.色彩矩陣分析 在色彩處理中,通常用以下三個角度來描述一個影象。 色調——物體傳播的顏色 飽和度——顏色的純度,從0(灰)到100%(飽和)來進行描述 亮度——顏色的相對明暗程度 在Android中,系統使用一個顏色矩陣——Colo

淺談android中圖片處理色彩特效處理ColorMatrix(三)

在android開發中對圖片處理很是頻繁,其中對圖片的顏色處理就是很常見的一種。我們經常看到一些類似美圖秀秀,美顏相機的app,為什麼那麼黑的人拍出來是確實那麼地白呢?長的那麼那個(醜)的人,用美顏相機拍出來的看起來也有那麼回事(拍出來就感覺挺漂亮)。就像網上有個段子,有錢

Android影象處理圖形特效處理

上一篇部落格說到了Android影象的色彩處理,使用的是ColorMatrix矩陣;本篇部落格說Android圖形的特效處理,使用的是Matrix這個類。 一、Android變形矩陣——Matricx: 跟Android影象的色彩處理基本一樣,只是將ColorMatrix換成了Matrix,ColorMat

Android繪圖機制與處理技巧(五)Android影象處理畫筆特效處理

前面的文章中已經學習了常用的畫筆屬性,比如普通的畫筆(Paint),帶邊框、填充的style,顏色(Color),寬度(StrokeWidth),抗鋸齒(ANTI_ALIAS_FLAG)等,然而Android還提供了各種各樣專業的畫筆工具,如記號筆、毛筆、蠟筆等

Android進階AS如何處理不同引用庫(module)裡jar的重複引起問題

1.問題 Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'. 2.原因 根據stackoverflow上面的回答,這個錯誤原因是因為包引用重複

Android面試系列非同步訊息處理相關

我們在平時的專案開發中,肯定會遇到處理非同步任務的場景。因為Android中的UI執行緒是不安全的,我們需要更新ui的話就必須在ui執行緒上進行操作。否則就會拋異常。 這個時候我們就需要用到非同步訊息處理了 比如,在子執行緒中請求資料,拿到資料後告訴ui執行

Android 效率開發圖片旋轉處理

之前寫過一篇 Android 三星手機拍照圖片旋轉處理,其實不止三星拍照的圖片會旋轉,小米的也會。這裡把旋轉的部分重新記錄下:1,先獲取圖片旋轉角度 /** * 獲取旋轉角度 *

掃描儀掃描文件處理圖像處理到生成PDF步驟簡述

strong 圖像處理 git 分享圖片 nbsp body www. 使用 mov ABBYY歪斜校正,然後另存“TIFF彩色LZW壓縮” https://github.com/barrer/scan-helper/blob/master/scan_h

資料預處理缺失值處理

資料預處理.1 缺失值處理 刪除法 刪除小部分樣本,在樣本量大時(刪除部分所佔比例小於5%時)可以使用 插補法 —均值插補:分為定距型(插入均值)和非定距型(眾數或者中值) —迴歸插補:線性和非線性迴歸 —極大似然估計M

影象分類:經典機器學習 Battle 深度學習

本文寫於2018.08.31, 生日前夕。 前段時間,有個朋友和我提到,自己最近正打算用機器來判別圖片中的場景是古鎮還是園林,所以我這一期特地寫了一篇文章,來描述影象的分類演算法。由於最近工作略忙,所以文章斷斷續續寫了好久,終於在自己生日前夕完成,希望可以有所幫助,這樣我就

Android Studio基礎依賴管理(五)-學習

在我們的專案中,或我或少都會用到一起第三方的庫,那麼對它的管理也就成為了專案中的一部分。這裡就介紹下在Android Studio中如何去管理專案中的庫和它們的依賴。 如何新增一個庫 Android Studio中新增一個庫有三種方法 第一種,直接

1.AndroidTextView控制元件學習筆記

TextView控制元件學習 1        建立TextView物件有兩種方法: 1.1  在程式中建立TextView物件; TextView tv=new TextView(this);       tv.setText("您好");      setContent

數字訊號處理(MATLAB版)學習筆記1--離散時間訊號與系統

一、週期序列的MATLAB程式設計 1.產生包含x(n)的P行矩陣 2.利用結構( : )將P行連成一個長的行向量。 注:( : )僅對列起作用,所以必須要用矩陣轉置符 '  程式 xtilde = x' * ones(1, P) %P代表x週期,x為一個一週期序列 xti

Android 影象識別OCR識別身份證,銀行卡等證件資訊

尊重作者勞動成果,轉載請註明出處 原文連結:https://mp.weixin.qq.com/s/oRpW9AWLx60GpINHJ__BNw 前言         OCR (Optical Character Recognition,光學字元識別)是指電子裝置(例

android影象儲存使用MediaStore

學習過ContentProvider,對於影象(以及音訊和視訊)的標準內容提供器是MediaStore,MediaStore是在裝置上的一個標準位置存放檔案的設定,並且為儲存和檢索該檔案的元資料提供便利。我們使用MediaStore來儲存,而不需要在SDCard的某位置上來

【Python】圖片處理“PythonMagick”庫簡易安裝筆記

“ImageMagick”可以說是開源的程式碼/命令列版PS,它支援包括建立、編輯、構圖再到格式轉換的圖片處理功能。更重要的是,它幾乎完整支援大部分程式語言,其中Python的介面庫就是“Pytho

Nginx模塊Nginx-Ts-Module學習筆記(一)搶險體驗

學習筆記 體驗 nginx模塊 int images clas tps gin issues 1、通過HTTP接收MPEG-TS2、生產和管理Live HLS 3、按照官方的編譯和配置,當然了我是第一次編譯沒有通過,在作者重新調整下,編譯成功,感謝:@arut https:

Python路第二天-----學習筆記

ati pop 可用 cor reverse 單詞 print 但是 進行 變量名要點: 1、變量名只能包含字母、 數字和下劃線。 變量名可以字母或下劃線打頭, 但不能以數字打頭, 例如, 可將變量命名為message_1, 但不能將其命名為1_message。 2、變量

Unity3DMecanim動畫系統學習筆記(二):模型導入

leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為

Unity3DMecanim動畫系統學習筆記(六):使用腳本控制動畫

ont nim 復制代碼 info rip esc enter machine images 控制人物動畫播放 這裏我重新弄了一個簡單的場景和新的Animator Controller來作為示例。 下面先看看Animator Controller的配置: 人物在站