1 简介
这项实验的目的是优化内存密集型代码,而“图像处理”为我们提供了许多优化函数的例子:
- 旋转,将图像逆时针旋转90度。
- 平滑,将图像“平滑”或者“模糊”。
1.1 旋转
在这个实验中,我们会把图像表示为一个二维矩阵M,其中Mij 表示矩阵M第(i,j)个像素的值,而像素值是由红,绿,蓝(RGB)组成的。
我们只考虑方形图像,这样只需要用一个字母N就可以表示图像的行数/列数。行和列的编号范围从 0 到 N - 1 。
鉴于以上的表示方式,对图像的旋转操作其实可以抽象为对矩阵的如下操作:
- 矩阵的转置。将 Mi,j 和 Mj,i 交换。
- 行交换。将第 i 行和第 N - 1 - i 行进行交换
我们用一张图来说明这两种矩阵操作。
从这张图可以看到,如果我们想旋转某张图片,就可以抽象为先对矩阵进行转置,再对矩阵做行交换。
1.2 平滑
平滑操作简单来说是取一个像素点,再计算出以它为中心周围 3 乘 3 像素的像素平均值,再将像素平均值赋值给这 3 乘 3 区域中的的每一个像素。