美文网首页
Android Matrix 的理解与应用

Android Matrix 的理解与应用

作者: hjm1fb | 来源:发表于2017-09-16 17:07 被阅读127次

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

    仿射变换

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

    颜色与色相修改

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

    Matrix内部实现

    点坐标用矩阵表示为

    这里写图片描述

    多一个1是为了形成齐次坐标系,以便用矩阵乘法来实现图像的仿射变换

    变换矩阵为3*3的矩阵

    这里写图片描述 这里写图片描述

    下面来看一段代码

    这里写图片描述

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

    这里写图片描述

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

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

    这里写图片描述

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

    这里写图片描述

    如何理解旋转矩阵:
    现设点P0(x0, y0)旋转θ角后的对应点为P(x, y)。通过使用向量,我们得到如下:
    x0 = r cosα
    y0 = r sinα
    x = r cos(α+θ) = x0 cosθ - y0 sinθ
    y = r sin(α+θ) = x0 sinθ + y0 cosθ
    于是我们得到如上旋转矩阵。

    矩阵相乘实现图像的变换

    如果图像围绕着某个点P(tx,ty)旋转,则先要

    1. 平移——将坐标系原点平移到点P(tx,ty);
    2. 旋转——以原点为中心旋转图像;
    3. 平移——将坐标系原点平移到原来的位置;

    如下图所示

    这里写图片描述

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

    这里写图片描述

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

    <big>理解常用的三种API</big>

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

    • preXXX
      右乘矩阵

    • postXXX
      左乘矩阵

    看个例子

    这里写图片描述

    对应的矩阵乘法如下

    这里写图片描述

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

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

    结语

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

    本文是自己理解矩阵的一些总结。参考和引用了如下文章,感谢各位作者

    Android Matrix理论与应用详解
    理解矩阵Matrix
    深入理解 Android 中的 Matrix
    仿射变换与齐次坐标

    相关文章

      网友评论

          本文标题:Android Matrix 的理解与应用

          本文链接:https://www.haomeiwen.com/subject/yiqusxtx.html