多语言展示
当前在线:826今日阅读:60今日分享:41

基于Mathematica的图像局部变形初步探索

本文,采用《一种人脸图像局部变形技术》一文里面提到的算法,用Mathematica代码,写出了用若干控制点,对图片进行局部变形的方法。但是,这组代码运行效率较低,还需要优化。
工具/原料
1

电脑

2

Mathematica

方法/步骤
2

给定一幅图片,作为实验对象。

3

为了能够清楚的看到变化细节,给图片蒙上一个网格;加网格,还有一个用处,就是大体确定某个点的坐标。加网格的方法,请参考《把图片置于复平面上进行共形变换》。

4

算法代码如下图所示。其中,P是选定的原图中的特征点集合;Q是目标特征点集合;P和Q中的点是一一对应的;r是特征点作用半径;f【x】是变换函数。

5

初始时刻,P里面只选择一个特征点:P = {{0, 0}};相应的,Q里面也有一个点:Q = {{1, 1}};这样,f就把原图的{0,0}点变到{1,1}点上。注意:{0,0}点一定是图片左下角;变形后的图片是下面这个样子。

6

如果把Q里面的点改为{1,1}/2,就会变成下图。

8

左上角是{0, 1}:P = {{0, 0}, {1, 1}, {0, 1}};Q = {{1, 1}/3, {1, 1}/3*2, {1/3, 2/3}};

9

固定四个角不变,变其它的点:P = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {1, 1}/2};Q = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 1}/2};

10

P = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {1/2, 1/3}};Q = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0.01, 0}};

11

把影响半径r改为2:r = 2;P = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 1/3}, {1/3., 0}};Q = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 0.01}, {1., 0}};

12

r = 2;P = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 1/3}, {1/3., 0}};Q = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 0.01}, {0.8, 0.1}};

注意事项
1

本文只介绍了最基本的算法,而且代码执行很耗时,还得不断优化。

2

上面的代码,只需要修改P、Q以及r,就可以了。

3

上面关于{1,1}是图片左上角的说法是不严格的,只有当图片宽度和高度一样才行。

推荐信息