Android影象處理之色彩特效處理(學習筆記)
彩色特效處理
1.色彩矩陣分析
在色彩處理中,通常用以下三個角度來描述一個影象。
- 色調——物體傳播的顏色
- 飽和度——顏色的純度,從0(灰)到100%(飽和)來進行描述
- 亮度——顏色的相對明暗程度
在Android中,系統使用一個顏色矩陣——ColorMatrix,來處理影象的這些色彩效果。Android中的顏色矩陣是一個4×5的數字矩陣,它用來對圖片的色彩進行處理。而對於每個畫素點,都有一個顏色分量矩陣用來儲存顏色的RGBA值,如下圖所示:
A=∣∣∣∣∣∣afkpbglqchmrdinsejot∣∣∣∣∣∣C=∣∣∣∣∣∣∣RGBA1∣∣∣∣∣∣∣
在這個4×5的顏色矩陣中按以下方式劃分。 - 第一行的abcde值用來決定新的顏色值中的R——紅色
- 第二行的fghij值用來決定新的顏色值中的G——綠色
- 第三行的klmno值用來決定新的顏色值中的B——藍色
- 第四行的pqrst值用來決定新的顏色值中的A——透明度
- 矩陣A中的第五列——ejot值分別用來決定每個分量重的offset,即偏移量。
1.1 改變偏移量
在這個矩陣中修改了R,G所對應的顏色偏移量,那麼最後的處理結果就是影象的紅色,綠色分量增加了100.而我們知道,紅色混合綠色會得到黃色,所以使得整個影象的色調偏黃色。
1.2 改變顏色系數
在這個矩陣中,改變了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的矩陣,如下:
相關推薦
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.Android之TextView控制元件學習筆記
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、變量
Unity3D之Mecanim動畫系統學習筆記(二):模型導入
leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為
Unity3D之Mecanim動畫系統學習筆記(六):使用腳本控制動畫
ont nim 復制代碼 info rip esc enter machine images 控制人物動畫播放 這裏我重新弄了一個簡單的場景和新的Animator Controller來作為示例。 下面先看看Animator Controller的配置: 人物在站