文章目录

  • 颜色模式
  • 颜色通道
  • Android 中的颜色矩阵
  • 矩阵乘法运算
  • 滤镜中的矩阵乘法运算
  • 矩阵加法运算
  • 滤镜中的矩阵乘法运算
  • 滤镜运算原理 ( 总结 )
  • 实际滤镜理论示例

颜色模式

颜色模式 : 将 某种颜色 表现为 数字形式 的模型 , 即记录图像颜色的方式 ; 下面是 所有的 颜色模式 :

  • 1.RGB 模式 : Red ( 红 ) , Green ( 绿 ) , Blue ( 蓝 ) , 三种颜色可组合成任意颜色 , 即 三原色原理 ;

  • 2.CMYK 模式 : 印刷模式 , Cyan ( 青 ) , Magenta ( 洋红 ) , Yellow ( 黄 ) , Black ( 黑 ) , 代表油墨的 4 种颜色 , 可以组合成任意颜色 ;

  • 3.HSB 模式 : Hue ( 色泽 ) , Saturation ( 饱和度 ) , Brightness ( 亮度 ) , 该模式基于人对于颜色的心里感受 ;

    • ① RGB 转 HSB 过程 : 其由 RGB 三原色转为 Lab 模式 , 在 Lab 模式基础上加入人对颜色的心理感受转换成的 ;
  • 4.Lab 模式 : Luminance ( 发光率 ) 和 ( a, b ) 两个颜色轴组成 , 由 RGB 三原色转换而来 ;

    • ① 转换中介 : RGB 转成 HSB 和 CMYK 都需要先转成 Lab 模式 , 然后转成对应的颜色模式 ;
  • 5.位图模式 : 用两种颜色 ( 黑 或 白 ) 表示图像像素 ;

    • ① 黑白图像 : 位图模式的图像也叫做黑白图像 ;
    • ② 位深度 : 其 位深度 为 1 , 又叫做 一位图像 ;
    • ③ 尺寸最小 : 在相同 宽度 , 高度 , 分辨率 情况下 , 位图模式尺寸最小 ;
    • ④ 转换不可逆 : 其它模式的图像转为位图图像 , 会丢失大量细节信息 , 因此该转换不可逆 ;
  • 6.灰度模式 : 像素由亮度值表示 , 取值范围 0 ( 黑色 ) 到 255 ( 白色 ) 之间 , 有 256 个级别的灰度值 ;

  • 7.索引颜色模式 : 每个像素 256 种可取值颜色 , 像素使用颜色的索引值来表示 ;

    • ① 转换过程 : RGB 转为索引颜色时 , 将每个像素的颜色值使用索引表示 ,
    • ② 替代方案 : 如果索引中没有该颜色 , 那么选一个近似的索引值代表这个颜色 ;
    • ③ 主要作用 : 能极大降低图片占用空间 ;
    • ④ 颜色表 : 存放颜色及对应的索引 , 颜色表可以在转换过程中定义 , 也可以在转换完成后修改 ;
  • 8.双色调模式 : 采用 2 ~ 4 种 色彩 , 创建 双色调 , 三色调 , 四色调 混合色阶 组成图像 ;

    • ① 灰度图像 转 双色调 : 该过程中 , 对色调进行编辑 , 产生彩色效果 ;
    • ② 目的 : 减少印刷成本 , 印刷时颜色越少 , 成本越低 ;
  • 9.多通道模式 : 主要用于特殊打印要求的图像 , 在保证 正确的图像颜色 基础上 减少印刷成本 ;

这里只做简单介绍 , 详细介绍需要为每个模式单开一篇博客讲解 ;


颜色通道

颜色通道简介 :

  • 1.颜色通道 : 保存图像的颜色信息的通道 , 称为颜色通道 ;
  • 2.颜色通道数量 : 每个图像都有 1 个 或 多个 颜色通道 , 其数量 取决于图像采用的颜色模式 ;
  • 3.颜色通道数量示例 :
    • ① 位图模式 , 灰度模式 , 索引颜色模式 , 双色调模式 : 1 个通道 ;
    • ② RGB , Lab 模式 : 3 个通道 ;
    • ③ CMYK 模式 : 4 个通道 ;

通道可以理解成一个数据 , 即图像的某个像素点数据结构的部分数据 , 如 RGB 图片 , 每个像素点都由 RGB 三个颜色数据组成 , 每个颜色就是一个通道 ;


Android 中的颜色矩阵

Android 中的颜色矩阵 :

  • 1.Android 颜色模式 : RGBA 4 通道 颜色模式 , Red ( 红 ) , Green ( 绿 ) , Blue ( 蓝 ) , Alpha ( 透明度 ) ;
  • 2.ColorMatrix 颜色矩阵 : 该矩阵是一个 4×54\times54×5 的矩阵 , 用于将图像像素的颜色值 , 具体就是修改图像像素值的 RGBA 颜色通道值 ;
    M=(abcdefghijklmnopqrst)M=\begin{pmatrix} a&b& c& d& e \\ f & g& h& i& j \\ k& l& m& n& o \\ p&q& r& s& t \\ \end{pmatrix}M=⎝⎜⎜⎛​afkp​bglq​chmr​dins​ejot​⎠⎟⎟⎞​
  • 3.矩阵在代码中的表示方式 : 在 Android 代码中 , 使用一个一维 float 数组表示该矩阵为 :
float matrix[] = { a, b, c, d, e,f, g, h, i, j,k, l, m, n, o,p, q, r, s, t };
  • 4.矩阵作用 : 该矩阵 与 RGBA 像素颜色值 , 进行计算 , 会得到一个新的 RGBA 颜色值 ;
  • 5.涉及的矩阵 : M=(abcdefghijklmnopqrst)M=\begin{pmatrix} a&b& c& d& e \\ f & g& h& i& j \\ k& l& m& n& o \\ p&q& r& s& t \\ \end{pmatrix}M=⎝⎜⎜⎛​afkp​bglq​chmr​dins​ejot​⎠⎟⎟⎞​ 矩阵 与 C1=(R1G1B1A1)C_1=\begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}C1​=⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​ 矩阵 , 经过指定的矩阵运算 , 得到矩阵 C2=(R2G2B2A2)C_2=\begin{pmatrix} R_2 \\ G_2 \\ B_2 \\ A_2\\ \end{pmatrix}C2​=⎝⎜⎜⎛​R2​G2​B2​A2​​⎠⎟⎟⎞​
  • 6.新矩阵值的计算方式 : 下面是 计算 新的像素值的公式 ;

R2=a∗R1+b∗G1+c∗B1+d∗A1+eR_2 = a*R_1 + b*G_1 + c*B_1 + d*A_1 + eR2​=a∗R1​+b∗G1​+c∗B1​+d∗A1​+e
G2=f∗R1+g∗G1+h∗B1+i∗A1+jG_2 = f*R_1 + g*G_1 + h*B_1 + i*A_1 + jG2​=f∗R1​+g∗G1​+h∗B1​+i∗A1​+j
B2=k∗R1+l∗G1+m∗B1+n∗A1+oB_2 = k*R_1 + l*G_1 + m*B_1 + n*A_1 + oB2​=k∗R1​+l∗G1​+m∗B1​+n∗A1​+o
A2=p∗R1+q∗G1+r∗B1+s∗A1+tA_2 = p*R_1 + q*G_1 + r*B_1 + s*A_1 + tA2​=p∗R1​+q∗G1​+r∗B1​+s∗A1​+t

  • 7.新矩阵计算公式总结 : 将 矩阵 M=(abcdefghijklmnopqrst)M=\begin{pmatrix} a&b& c& d& e \\ f & g& h& i& j \\ k& l& m& n& o \\ p&q& r& s& t \\ \end{pmatrix}M=⎝⎜⎜⎛​afkp​bglq​chmr​dins​ejot​⎠⎟⎟⎞​ 拆分成 M1=(abcdfghiklmnpqrs)M_1=\begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix}M1​=⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​ 和 M2=(ejot)M_2=\begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix}M2​=⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​ , 与 C1=(R1G1B1A1)C_1=\begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}C1​=⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​ 进行计算 , 得到矩阵 C2=(R2G2B2A2)C_2=\begin{pmatrix} R_2 \\ G_2 \\ B_2 \\ A_2\\ \end{pmatrix}C2​=⎝⎜⎜⎛​R2​G2​B2​A2​​⎠⎟⎟⎞​ , 计算公式 如下 :
    M1×C1+M2=C2M_1 \times C_1 + M_2 = C_2M1​×C1​+M2​=C2​

下面会简单讲解矩阵乘法 和 加法的原理 , 深入学习的话 , 去找本线性代数的书学习 , 建议大家学习图形 , 图像 , 音视频处理等技术时 , 把 线性代数 和 矩阵论 相关数学知识也学习一下 ;


矩阵乘法运算

矩阵乘法 :

  • 1.矩阵表示方法 : mmm 行 ( Row ) nnn 列 ( Column ) 的矩阵 , 表示成 m×nm \times nm×n 矩阵 ; ( 矩阵表示时 , 行数在前 , 列数在后 )
  • 2.矩阵乘法可执行的前提 :
    • ① AAA 矩阵 : ma×nam_a \times n_ama​×na​ 矩阵 , 即 mam_ama​ 行 nan_ana​ 列矩阵 ;
    • ② BBB 矩阵 : mb×nbm_b \times n_bmb​×nb​ 矩阵 , 即 mbm_bmb​ 行 nbn_bnb​ 列矩阵 ;
    • ③ 满足前提 : 两个矩阵进行乘法运算 A×BA \times BA×B , 前一个矩阵 AAA 的列数 nan_ana​ 必须 与 后一个矩阵 BBB 的行数 mbm_bmb​ 相等 ;
  • 3.矩阵乘法计算方法 :
    • ① 矩阵乘法计算结果行列数 :

      • 1> 结果行列数 : 上述矩阵 A×BA \times BA×B 得到的是一个 mam_ama​ 行 , nbn_bnb​ 列的矩阵 CCC ;
      • 2>取值来源 : 即 结果的行数 等于 矩阵 AAA 的行数 , 结果的列数 , 等于矩阵 BBB 的列数 ;
    • ② 某位置的具体值 :
      • 1> 讨论矩阵 : CCC 矩阵是一个 ma×nbm_a \times n_bma​×nb​ 矩阵 ;
      • 2> 索引范围 : 讨论 其中 第 iii ( 1≤i≤ma1 \leq i \leq m_a1≤i≤ma​ ) 行第 jjj ( 1≤j≤nb1 \leq j \leq n_b1≤j≤nb​ ) 列位置的值 ;
      • 3> 对应值大小 : 是 AAA 矩阵第 iii 行的元素 ( 有 nan_ana​ 个 ) 与 BBB 矩阵 第 jjj ( 有 mbm_bmb​ 个 na=mbn_a=m_bna​=mb​ ) 列的元素按照对应位置逐个相乘 , 最后将所有 nan_ana​ 个相乘结果相加即可得到 i行j列i行j列i行j列 元素的值 ;
  • 4.简单示例 : 矩阵 A=(a1,1a1,2a1,3a2,1a2,2a2,3)A=\begin{pmatrix} a_{1, 1}&a_{1, 2}& a_{1, 3}\\ a_{2, 1}&a_{2, 2}& a_{2, 3} \end{pmatrix}A=(a1,1​a2,1​​a1,2​a2,2​​a1,3​a2,3​​) 和矩阵 B=(b1,1b1,2b2,1b2,2b3,1b3,2)B=\begin{pmatrix} b_{1, 1}&b_{1, 2}\\ b_{2, 1}&b_{2, 2}\\ b_{3, 1}&b_{3, 2}\\ \end{pmatrix}B=⎝⎛​b1,1​b2,1​b3,1​​b1,2​b2,2​b3,2​​⎠⎞​ 相乘 , 其结果是 C=A×B=(a1,1b1,1+a1,2b2,1+a1,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,2a2,1b1,1+a2,2b2,1+a2,3b3,1a2,1b1,2+a2,2b2,2+a2,3b3,2)\\ \\ C=A\times B= \begin{pmatrix} a_{1, 1}b_{1, 1} + a_{1, 2}b_{2, 1} + a_{1, 3}b_{3, 1}& a_{1, 1}b_{1, 2} + a_{1, 2}b_{2, 2} + a_{1, 3}b_{3, 2}\\ a_{2, 1}b_{1, 1} + a_{2, 2}b_{2, 1} + a_{2, 3}b_{3, 1}& a_{2, 1}b_{1, 2} + a_{2, 2}b_{2, 2} + a_{2, 3}b_{3, 2}\\ \end{pmatrix} \\ \\ C=A×B=(a1,1​b1,1​+a1,2​b2,1​+a1,3​b3,1​a2,1​b1,1​+a2,2​b2,1​+a2,3​b3,1​​a1,1​b1,2​+a1,2​b2,2​+a1,3​b3,2​a2,1​b1,2​+a2,2​b2,2​+a2,3​b3,2​​)

滤镜中的矩阵乘法运算

滤镜中对应的矩阵乘法 :

  • 1.矩阵 1 : M1=(abcdfghiklmnpqrs)M_1=\begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix}M1​=⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​ , 代表 修改像素值的 颜色矩阵 的部分 拆分结果 ;
  • 2.矩阵 2 : C1=(R1G1B1A1)C_1=\begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}C1​=⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​ , 代表 RGB 颜色值和 A 透明度值 ;
  • 3.矩阵大小说明 : M1M_1M1​ 矩阵是 4×44 \times 44×4 矩阵 , C1C_1C1​ 矩阵是 4×14 \times 14×1 矩阵 ;
  • 4. 矩阵相乘判定 : M1M_1M1​ 矩阵的列数 等于 C1C_1C1​ 矩阵的行数 , 两个矩阵可以进行乘法运算 ;
  • 5. 矩阵运算结果 : M1M_1M1​ 矩阵 与 C1C_1C1​ 矩阵相乘的结果是一个 4×14\times14×1 的矩阵, 计算过程如下 :
    M1×C1=(abcdfghiklmnpqrs)×(R1G1B1A1)=(a∗R1+b∗G1+c∗B1+d∗A1f∗R1+g∗G1+h∗B1+i∗A1k∗R1+l∗G1+m∗B1+n∗A1p∗R1+q∗G1+r∗B1+s∗A1)\begin{array}{lcl}M_1 \times C_1 &=& \begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix} \times \begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}\\ \\ &=&\begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1\\ f*R_1 + g*G_1 + h*B_1 + i*A_1\\ k*R_1 + l*G_1 + m*B_1 + n*A_1\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 \end{pmatrix} \\ \end{array}M1​×C1​​==​⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​×⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​f∗R1​+g∗G1​+h∗B1​+i∗A1​k∗R1​+l∗G1​+m∗B1​+n∗A1​p∗R1​+q∗G1​+r∗B1​+s∗A1​​⎠⎟⎟⎞​​

矩阵加法运算

矩阵加法 :

  • 1.矩阵加法前提 : 进行加法运算的两个矩阵 , 其大小必须相同 , 即 行列数 都要相同才可以 ;
  • 2.矩阵加法运算 : 将两个矩阵对应的位置相加 ;
  • 3.简单示例 : 矩阵 A=(a1,1a1,2a2,1a2,2)A=\begin{pmatrix} a_{1, 1}&a_{1, 2}\\ a_{2, 1}&a_{2, 2} \end{pmatrix}A=(a1,1​a2,1​​a1,2​a2,2​​) 和矩阵 B=(b1,1b1,2b2,1b2,2)B=\begin{pmatrix} b_{1, 1}&b_{1, 2}\\ b_{2, 1}&b_{2, 2}\\ \end{pmatrix}B=(b1,1​b2,1​​b1,2​b2,2​​) 相加 ; 其结果是 C=A+B=(a1,1+b1,1a1,2+b1,2a2,1+b2,1a2,2+b2,2)\\ \\ C=A + B= \begin{pmatrix} a_{1, 1} + b_{1, 1}& a_{1, 2} + b_{1, 2}\\ a_{2, 1}+b_{2, 1} & a_{2, 2} + b_{2, 2} \\ \end{pmatrix} \\ \\ C=A+B=(a1,1​+b1,1​a2,1​+b2,1​​a1,2​+b1,2​a2,2​+b2,2​​)

滤镜中的矩阵乘法运算

在上述 M1M_1M1​ 矩阵 与 C1C_1C1​ 矩阵相乘的结果是一个 4×14\times14×1 的矩阵, 计算过程如下 :
M1×C1=(abcdfghiklmnpqrs)×(R1G1B1A1)=(a∗R1+b∗G1+c∗B1+d∗A1f∗R1+g∗G1+h∗B1+i∗A1k∗R1+l∗G1+m∗B1+n∗A1p∗R1+q∗G1+r∗B1+s∗A1)\begin{array}{lcl}M_1 \times C_1 &=& \begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix} \times \begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}\\ \\ &=&\begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1\\ f*R_1 + g*G_1 + h*B_1 + i*A_1\\ k*R_1 + l*G_1 + m*B_1 + n*A_1\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 \end{pmatrix} \\ \end{array}M1​×C1​​==​⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​×⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​f∗R1​+g∗G1​+h∗B1​+i∗A1​k∗R1​+l∗G1​+m∗B1​+n∗A1​p∗R1​+q∗G1​+r∗B1​+s∗A1​​⎠⎟⎟⎞​​

上述 4×14 \times 14×1 矩阵 在加上一个 M2=(ejot)M_2=\begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix}M2​=⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​ 矩阵 , 即可得到新的像素值 矩阵 ;

两个矩阵都是 4 行 1 列的 4×14\times 14×1 的矩阵 , 因此将对应位相加即可 :

(a∗R1+b∗G1+c∗B1+d∗A1f∗R1+g∗G1+h∗B1+i∗A1k∗R1+l∗G1+m∗B1+n∗A1p∗R1+q∗G1+r∗B1+s∗A1)+(ejot)=(a∗R1+b∗G1+c∗B1+d∗A1+ef∗R1+g∗G1+h∗B1+i∗A1+jk∗R1+l∗G1+m∗B1+n∗A1+op∗R1+q∗G1+r∗B1+s∗A1+t)\begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1\\ f*R_1 + g*G_1 + h*B_1 + i*A_1\\ k*R_1 + l*G_1 + m*B_1 + n*A_1\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 \end{pmatrix} + \begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix} = \begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1 + e\\ f*R_1 + g*G_1 + h*B_1 + i*A_1 + j\\ k*R_1 + l*G_1 + m*B_1 + n*A_1 + o\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 + t \end{pmatrix}⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​f∗R1​+g∗G1​+h∗B1​+i∗A1​k∗R1​+l∗G1​+m∗B1​+n∗A1​p∗R1​+q∗G1​+r∗B1​+s∗A1​​⎠⎟⎟⎞​+⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​=⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​+ef∗R1​+g∗G1​+h∗B1​+i∗A1​+jk∗R1​+l∗G1​+m∗B1​+n∗A1​+op∗R1​+q∗G1​+r∗B1​+s∗A1​+t​⎠⎟⎟⎞​


滤镜运算原理 ( 总结 )

① Android 显示图片方法 : 在 Android 手机中 , 一张图片 , 加载到内存中显示出来 , 其中 Android 中使用的颜色模式是 RGBA 模式 , 其有 4 个通道 ;

② RGBA 通道含义 : 在 Android 中每个像素点都包含 RGBA 四个通道信息, 分别是 Red ( 红 ) , Green ( 绿 ) , Blue ( 蓝 ) , Alpha ( 透明度 ) ;

③ 表示方法 : Android 中使用矩阵表示一个像素点的信息 , 如 C1=(R1G1B1A1)C_1=\begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}C1​=⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​ , 该矩阵表示一个像素点的信息 ;

④ 引入滤镜 : 颜色通道中的信息是可以修改的 , 即可以修改一个图片中像素点的颜色值 , 这个修改的方法就是使用滤镜进行修改 ;

⑤ 通道过滤矩阵 : Android 中定义了一个 过滤矩阵 MMM , 专门用于计算每个像素点的颜色值的 , 将原来的颜色值矩阵 C1C_1C1​ 与 过滤矩阵 MMM 进行计算 , 得到一个新的颜色值 C2C_2C2​ , 将图片中所有的像素点都使用该矩阵计算一遍 , 这个过程就是使用滤镜处理图片的原理 ;

⑥ 过滤矩阵说明 : 过滤矩阵是一个 4×54\times54×5 的矩阵 , 其有 4 行 5 列 , 如 : M=(abcdefghijklmnopqrst)M=\begin{pmatrix} a&b& c& d& e \\ f & g& h& i& j \\ k& l& m& n& o \\ p&q& r& s& t \\ \end{pmatrix}M=⎝⎜⎜⎛​afkp​bglq​chmr​dins​ejot​⎠⎟⎟⎞​ ;

⑦ 过滤矩阵拆分 : 过滤矩阵可以分为两部分 , 一部分是一个 4×44 \times 44×4 的颜色矩阵 M1=(abcdfghiklmnpqrs)M_1=\begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix}M1​=⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​ , 另一部分是 一个 4×14\times14×1 的颜色增量值矩阵 , M2=(ejot)M_2=\begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix}M2​=⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​ ;

⑧ M1M_1M1​拆分矩阵的作用 : M1M_1M1​ 矩阵主要是让像素点的 ARGB 四个通道的值 翻倍 , 指定一个 浮点型的 倍数 , 进行计算 ; ( 详细原理请看下面的 实际滤镜理论示例 )

⑨ M2M_2M2​拆分矩阵的作用 : M2M_2M2​ 矩阵主要是让像素点的 ARGB 四个通道的值 进行增量修改 , 指定一个 浮点型的 数 , 进行计算 ; ( 详细原理请看下面的 实际滤镜理论示例 )

⑩ 计算过程 : C2C_2C2​ 是需要计算的新的像素值 , 公式为 M1×C1+M2=C2M_1 \times C_1 + M_2 = C_2M1​×C1​+M2​=C2​ ;

M1×C1+M2=(abcdfghiklmnpqrs)×(R1G1B1A1)+(ejot)=(a∗R1+b∗G1+c∗B1+d∗A1f∗R1+g∗G1+h∗B1+i∗A1k∗R1+l∗G1+m∗B1+n∗A1p∗R1+q∗G1+r∗B1+s∗A1)+(ejot)=(a∗R1+b∗G1+c∗B1+d∗A1+ef∗R1+g∗G1+h∗B1+i∗A1+jk∗R1+l∗G1+m∗B1+n∗A1+op∗R1+q∗G1+r∗B1+s∗A1+t)\begin{array}{lcl}M_1 \times C_1 + M_2 &=& \begin{pmatrix} a&b& c& d\\ f & g& h& i \\ k& l& m& n \\ p&q& r& s\\ \end{pmatrix} \times \begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix} + \begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix}\\ \\ &=&\begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1\\ f*R_1 + g*G_1 + h*B_1 + i*A_1\\ k*R_1 + l*G_1 + m*B_1 + n*A_1\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 \end{pmatrix} + \begin{pmatrix} e \\ j \\ o \\ t \\ \end{pmatrix} \\ \\ &=&\begin{pmatrix} a*R_1 + b*G_1 + c*B_1 + d*A_1 + e\\ f*R_1 + g*G_1 + h*B_1 + i*A_1 + j\\ k*R_1 + l*G_1 + m*B_1 + n*A_1 + o\\ p*R_1 + q*G_1 + r*B_1 + s*A_1 + t \end{pmatrix} \\ \end{array}M1​×C1​+M2​​===​⎝⎜⎜⎛​afkp​bglq​chmr​dins​⎠⎟⎟⎞​×⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​+⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​f∗R1​+g∗G1​+h∗B1​+i∗A1​k∗R1​+l∗G1​+m∗B1​+n∗A1​p∗R1​+q∗G1​+r∗B1​+s∗A1​​⎠⎟⎟⎞​+⎝⎜⎜⎛​ejot​⎠⎟⎟⎞​⎝⎜⎜⎛​a∗R1​+b∗G1​+c∗B1​+d∗A1​+ef∗R1​+g∗G1​+h∗B1​+i∗A1​+jk∗R1​+l∗G1​+m∗B1​+n∗A1​+op∗R1​+q∗G1​+r∗B1​+s∗A1​+t​⎠⎟⎟⎞​​


实际滤镜理论示例

实际滤镜理论示例 :

  • 1.颜色矩阵示例 : 4×54 \times 54×5 的颜色过滤矩阵 M=(10000010000010000010)M=\begin{pmatrix} 1&0& 0& 0& 0 \\ 0& 1& 0& 0& 0 \\ 0& 0& 1& 0& 0 \\ 0&0& 0& 1& 0 \\ \end{pmatrix}M=⎝⎜⎜⎛​1000​0100​0010​0001​0000​⎠⎟⎟⎞​ , 该 过滤矩阵 与 C1=(R1G1B1A1)C_1=\begin{pmatrix} R_1 \\ G_1 \\ B_1 \\ A_1\\ \end{pmatrix}C1​=⎝⎜⎜⎛​R1​G1​B1​A1​​⎠⎟⎟⎞​ 颜色矩阵计算后的结果还是 C1C_1C1​ ;

  • 2.该过滤矩阵对于颜色值的影响 :

    • 红色 : 第 111 行 第 111 列 代表 Red 通道信息 ;
    • 绿色 : 第 222 行 第 222 列 代表 Green通道信息 ,
    • 蓝色 : 第 333 行 第 333 列 代表 Blue 通道信息 ,
    • 透明度 : 第 444 行 第 444 列 代表 Alpha 通道信息 ;
  • 3.将某种颜色值翻倍 :
    假如使用 M=(20000010000010000010)M=\begin{pmatrix} 2&0& 0& 0& 0 \\ 0& 1& 0& 0& 0 \\ 0& 0& 1& 0& 0 \\ 0&0& 0& 1& 0 \\ \end{pmatrix}M=⎝⎜⎜⎛​2000​0100​0010​0001​0000​⎠⎟⎟⎞​ 矩阵 , 此时 Red ( 红色 ) 的通道值会翻倍 , 像素中红色的颜色值会增加一倍 ;

  • 4.将某种颜色值增加 :
    假如使用 M=(100050010000010000010)M=\begin{pmatrix} 1&0& 0& 0& 50 \\ 0& 1& 0& 0& 0 \\ 0& 0& 1& 0& 0 \\ 0&0& 0& 1& 0 \\ \end{pmatrix}M=⎝⎜⎜⎛​1000​0100​0010​0001​50000​⎠⎟⎟⎞​ 矩阵 , 此时 Red ( 红色 ) 的通道值会增加 50 ;


【Android 应用开发】Paint 滤镜原理 之 颜色矩阵 ( 颜色模式 | 颜色通道 | 颜色矩阵 | 矩阵运算 | 矩阵乘法 | 矩阵加法 | 颜色矩阵深入解析 )相关推荐

  1. 【Android 应用开发】Paint 滤镜原理 之 图像结构 ( 图片文件二进制分析 | PNG文件结构 | 数据块结构 | IHDR 数据块详解 )

    文章目录 图形文件准备 ( PNG 文件 ) PNG 文件信息分类 数据块结构 IHDR 数据块 简介 IHDR 数据块 结构 图形文件准备 ( PNG 文件 ) 分析的文件准备 : 1.创建文件 : ...

  2. Android Ap 开发 设计模式第四篇:工厂方法模式

    Factory Method Pattern 模板模式的衍生品? 以Template Method Pattern 架构获取产生对象实例的工厂就是Factory Method Pattern. 工厂方 ...

  3. Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

    若是曾经查看过系统UI的源码, 会发现其中使用了一些渲染效果,例如将图片加上黑白.怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了滤镜效果.颜色通道过滤.若还要深究其原理组成,便涉及到了高等 ...

  4. 高级UI之Paint(滤镜,颜色通道,矩阵运算)

    前言 在之前的几次课当中我们已经详细了解到整个android程序,从启动再到绘制的整体流程,从这中间我们又牵扯出了Canvas绘制图形的画板和我们的Paint控制色彩样式的画笔,那么之前基础篇我们就不 ...

  5. Android游戏开发之飞行射击类游戏原理实现(二十)

    Android游戏开发之飞行射击类游戏原理实现 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/arch ...

  6. (转载)Android游戏开发之旅一 长按Button原理

    (转载)http://www.android123.com.cn/androidkaifa/538.html 作者: Android开发网原创 时间: 2010-06-22 今天Android123开 ...

  7. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19913755 . 一. Android资源文件简介 1 ...

  8. 【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组...

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19913755 . 一. Android资源文件简介 1 ...

  9. 关于如何定制开发Android第三方ROM,最全开发教程、原理阐述

    一.首先,搞明白ROM的概念. 广义上对于ROM,有两种定义: 1.官方原厂ROM. 就是官方适配的ROM,无修改,原汁原味由品牌厂商自己定制开发的ROM. 2.第三方定制ROM. 意思很明确,就是经 ...

最新文章

  1. ML基石_4_FeasibilityOfLearning
  2. java起源_Java的来源
  3. 【Android 逆向】ELF 文件格式 ( ELF 文件简介 | ELF 文件结构 )
  4. 2021云数据库RDS重磅升级发布会
  5. Android Studio出现UnsupportedClassVersionError Unsupported major.minor version 52.0
  6. nginx处理http(http变量篇)
  7. dp按照规模分类总结
  8. java 爬虫_探索Java 多线程爬虫及分布式爬虫架构
  9. MVC系列-7.更新
  10. 将您的SQL Server工作负载迁移到PostgreSQL –第4部分
  11. Python+pandas处理Excel文件中的超市营业额数据
  12. 【实践】CTR预估在动态样式建模和特征表达学习方面的进展
  13. Mac与Windows快捷键盘点
  14. Java编程降序排序代码,Java选择排序(升序跟降序)
  15. php 魔方加密还原,PHP魔方解密 - osc_80l29rkk的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. EC11编码器原理以及驱动程序
  17. 使用vim修改只读文件
  18. 贴片电阻、贴片电容规格、封装、尺寸·功率
  19. linux触摸板设置密码程序6,Touchegg:Linux上触摸板/屏的多指手势
  20. PPT怎么添加到公众号文章

热门文章

  1. 使用RDLC报表向报表传入参数
  2. 绝对Linux服务器管理利器webmin
  3. IE下a标签会触发window.onbeforeunload的问题
  4. 对软件工程与计算机科学之间区别的看法
  5. U盘安装Linux CentOS 6.5 64位操作系统(来自互联网)
  6. Tomcat绿色版启动startup.bat一闪问题的解决方法!
  7. Ganglia 调试技巧
  8. ZOJ 1049 2^x mod n = 1
  9. JS:attachEvent和addEventListener方法
  10. IntelliJ中的main函数、for循环、System.out.println()快捷键