我正在尝试使用图像魔术来实现像经线一样的photoshop。我试图将4x4网格图像中的初始16点移动到最终16点。我有最初的16分和最后的16分。
这里的点是网格交点的x,y坐标。
我正在使用Shepards失真。
这会导致一些意外的翘曲。
如果还有其他可用的方法,请分享。
我想实现这样的目标。我有最初的16分和最后的16分。
答案 0 :(得分:2)
我已经通过在Photoshop的输入和输出图像中的网格相交处选择控制点来处理您的网格图像。我使用ImageJ pointpicker插件来帮助我选择和保存控制点。参见http://bigwww.epfl.ch/thevenaz/pointpicker/
然后我使用那些控制点使用ImageMagick二阶多项式扭曲。
我将控制点列表放入输入和输出图像的数组中。然后,我将它们合并为in1 out1 in2 out2 ... in16 out16(作为对应对)。
inArr=(17,20
280,22
542,21
806,20
16,286
280,286
542,286
808,285
17,549
280,549
542,550
805,549
17,812
280,812
542,812
806,808)
outArr=(348,13
420,41
522,48
582,66
277,302
328,320
409,346
481,360
230,516
332,548
442,569
516,552
289,748
402,776
542,766
638,713)
list="2"
for ((i=0; i<16; i++)); do
list="$list ${inArr[$i]} ${outArr[$i]}"
done
echo $list
2 17,20 348,13 280,22 420,41 542,21 522,48 806,20 582,66 16,286 277,302 280,286 328,320 542,286 409,346 808,285 481,360 17,549 230,516 280,549 332,548 542,550 442,569 805,549 516,552 17,812 289,748 280,812 402,776 542,812 542,766 806,808 638,713
请注意,上面的第一项是2,这意味着控制点将适合于二阶多项式。
以下,在进行变形之前,我先将网格线之外的区域设为透明,以使外部区域不会显示在变形的图像中。我通过将外部黑色区域填充为透明(无颜色)来完成此操作。失真使用了-virtual-pixel none,所以输入图像之外的任何东西都是透明的。
convert grid.png -fuzz 10% -fill none -draw "matte 0,0 floodfill" -virtual-pixel none -distort polynomial "$list" grid_warp2.png
这是三阶多项式结果:
list="3"
for ((i=0; i<16; i++)); do
list="$list ${inArr[$i]} ${outArr[$i]}"
done
echo $list
3 17,20 348,13 280,22 420,41 542,21 522,48 806,20 582,66 16,286 277,302 280,286 328,320 542,286 409,346 808,285 481,360 17,549 230,516 280,549 332,548 542,550 442,569 805,549 516,552 17,812 289,748 280,812 402,776 542,812 542,766 806,808 638,713
convert grid.png -fuzz 10% -fill none -draw "matte 0,0 floodfill" -virtual-pixel none -distort polynomial "$list" grid_warp3.png
更多的控制点可能会提供与Photoshop更为接近的结果。