图像处理中的矩阵能做什么

仿射变换

  • 缩放 旋转 移动 翻转 错切对应Matrix类

颜色与色相修改

  • 对比度 亮度 饱和度 滤镜 对应ColorMatrix类

Matrix内部实现

点坐标用矩阵表示为

Android Paint 矩阵 android矩阵变换_android

 

变换矩阵为3*3的矩阵

Android Paint 矩阵 android矩阵变换_移动_02

Android Paint 矩阵 android矩阵变换_移动_03

下面来看一段代码

Android Paint 矩阵 android矩阵变换_矩阵变换_04

上图第四行的平移变换实现如下

Android Paint 矩阵 android矩阵变换_Android Paint 矩阵_05

通过矩阵计算可验证其正确性

第三行的缩放变换实现如下

Android Paint 矩阵 android矩阵变换_matrix_06

第四行的旋转变换实现如下

Android Paint 矩阵 android矩阵变换_矩阵变换_07

 

矩阵相乘实现图像的变换

如果图像围绕着某个点P(tx,ty)旋转,则先要
1. 平移——将坐标系原点平移到点P(tx,ty);
2. 旋转——以原点为中心旋转图像;
3. 平移——将坐标系原点平移到原来的位置;

如下图所示

Android Paint 矩阵 android矩阵变换_matrix_08

代码实现如下(忽略第三行。。。)

Android Paint 矩阵 android矩阵变换_矩阵变换_04

其实Android已经封装了这样的操作,即 matrix.setRotate(30,tx,ty);

理解常用的三种API

  • setXXX
    先调用reset, 重置矩阵,然后set,所以之前例子的setScale( 0.5f,0.5f )实际上是无效的
  • preXXX
    右乘矩阵
  • postXXX
    左乘矩阵

看个例子

Android Paint 矩阵 android矩阵变换_移动_10

对应的矩阵乘法如下

Android Paint 矩阵 android矩阵变换_矩阵变换_11

矩阵运算满足交换律 (AB)C=A(BC)

安卓执行矩阵变换时,变换的矩阵放在左边,所以应该从右到左的理解上图。所以上图的执行顺序是 translate -> rotate -> scale -> translate。这样,pre就可以理解为先行执行的操作,post为靠后执行的操作

结语

如果是简单的矩阵变换,调用安卓的封装好的API就行,但了解矩阵变换的原理,能让我们实现复杂的图像变换,遇到问题时,也能通过打印矩阵来调试