算法:对给定图像做二维仿射变换。仿射模型为 x′=ax+by+tx,y′=cx+dy+ty。 为避免“空洞”,采用逆映射 + 最近邻插值:对每个输出像素 (x′,y′),先减去平移,再乘线性部分的逆矩阵,得到源坐标 (x,y)。若 (x,y) 在原图范围内,则取最近邻像素;否则置 0。
核心实现:
人脸关键点对齐是人脸识别算法过程中非常重要的一步,其方法是基于检测人脸关键点及模板人脸关键点获得变换矩阵 M ,使得最小二乘意义下把原图的关键点贴到模板关键点位置,其基本原理是对图像得仿射变换。现在你将实现一个图像的仿射变换函数,该函数接收一个二维图像矩阵 A 、一个变换矩阵 M 和输出图像的尺寸 0 ,返回变换后的图像。
变换公式为,其中 x,y 为原坐标, x′,y′ 为变换后的坐标, a,b,c,d 是线性变换部分的系数, tx,ty 是平移向量: x′=a×x+b×y+tx
y′=c×x+d×y+ty
如果变换后的坐标超出原图像范围,则不赋值(保留为 0 )。
输入图像 A :一个二维列表,表示输入图像,每个元素是一个像素值。
交换矩阵 M :一个二维列表,格式如下:
[[a,b,tx],[c,d,ty]]
输出图像的尺寸 height,width
输入第一行分别为 A、M 列表的长度 a,m 以及输出列表 O 所占用的行,接下来的 a 行为输入图像 A ,然后 m 行是输入变换矩阵,最后一行是输出图像的大小
返回一个二维列表,表示变换后的图像
输入
3 2 1
10 20 30
40 50 60
70 80 90
0 1 0
-1 0 2
3 3
输出
30 60 90 20 50 80 10 40 70
说明
第一行 3 2 1 表示:
从第二行起接下来的三行是图像 A 的输入,然后下面两行是变换矩阵的输入,最后一行是输出图像的高度及宽度
输出图像矩阵为 [[30,60,90],[20,50,80],[10,40,70] ,
展开后最终的输出为 30 60 90 20 50 80 10 40 70
输入
3 2 1
10 20 30
40 50 60
70 80 90
-1 0 2
0 1 0
3 4
输出
30 20 10 0 60 50 40 0 90 80 70 0
提示
1.如果变换矩阵的线性部分 (a,b,c,d) 不可逆,则返回一个全 0 的图像