电脑
Mathematica
给定一幅图片,作为实验对象。
为了能够清楚的看到变化细节,给图片蒙上一个网格;加网格,还有一个用处,就是大体确定某个点的坐标。加网格的方法,请参考《把图片置于复平面上进行共形变换》。
算法代码如下图所示。其中,P是选定的原图中的特征点集合;Q是目标特征点集合;P和Q中的点是一一对应的;r是特征点作用半径;f【x】是变换函数。
初始时刻,P里面只选择一个特征点:P = {{0, 0}};相应的,Q里面也有一个点:Q = {{1, 1}};这样,f就把原图的{0,0}点变到{1,1}点上。注意:{0,0}点一定是图片左下角;变形后的图片是下面这个样子。
如果把Q里面的点改为{1,1}/2,就会变成下图。
左上角是{0, 1}:P = {{0, 0}, {1, 1}, {0, 1}};Q = {{1, 1}/3, {1, 1}/3*2, {1/3, 2/3}};
固定四个角不变,变其它的点:P = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {1, 1}/2};Q = {{1, 1}, {1, 0}, {0, 1}, {0, 0}, {0, 1}/2};
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}};
把影响半径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}};
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}};
本文只介绍了最基本的算法,而且代码执行很耗时,还得不断优化。
上面的代码,只需要修改P、Q以及r,就可以了。
上面关于{1,1}是图片左上角的说法是不严格的,只有当图片宽度和高度一样才行。