Imagemagick 如何在imagick中实现类似photoshop的扭曲

Imagemagick 如何在imagick中实现类似photoshop的扭曲,imagemagick,imagemagick-convert,Imagemagick,Imagemagick Convert,我正试图实现photoshop一样的扭曲使用图像magick。我尝试将4x4栅格图像中最初的16点移动到最后的16点。我有最初的16分和最后的16分 这里的点是网格交点的x,y坐标 我用的是谢泼德失真 convert d1s.png -matte -virtual-pixel transparent -distort Shepards "0,0 0,234 158,0 973,300 316,0 1120,367 474,0 1336,411 0,667 0,842 158,

我正试图实现photoshop一样的扭曲使用图像magick。我尝试将4x4栅格图像中最初的16点移动到最后的16点。我有最初的16分和最后的16分

这里的点是网格交点的x,y坐标

我用的是谢泼德失真

convert d1s.png -matte -virtual-pixel transparent -distort Shepards "0,0 0,234  158,0 973,300  316,0 1120,367  474,0 1336,411  0,667 0,842  158,667 810,858  316,667 998,878 474,667 1130,898  0,1333 0,1370  158,1333 700,1396 316,1333 936,1411 474,1333 1084,1418  0,2000 0,1886  158,2000 936,1942  316,2000 1105,1945  474,2000 1321,1900" outputs.png
这会导致一些意想不到的扭曲

如果还有其他方法,请分享

更新: 输入图像

输出图像


我想实现这样的目标。我有最初的16个点和最后的16个点。

我通过在Photoshop输入和输出图像的网格交点处拾取控制点来处理网格图像。我使用ImageJ pointpicker插件来帮助我拾取和保存控制点。看

然后我使用ImageMagick二阶多项式扭曲使用这些控制点

我将控制点列表放入一个数组中,用于输入和输出图像。然后我把它们合并成1 out1和2 out2的格式。。。16输出16(作为对应的对)


以下是三阶多项式结果:

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
list=“3”

对于((i=0;i我通过在Photoshop的输入和输出图像的网格交点处拾取控制点来处理网格图像。我使用ImageJ pointpicker插件来帮助拾取和保存控制点。请参阅

然后我使用ImageMagick二阶多项式扭曲使用这些控制点

我将控制点列表放入一个数组中,用于输入和输出图像。然后我将它们合并为in1out1 in2out2…in16out16格式(作为对应的对)


以下是三阶多项式结果:

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
list=“3”

对于((i=0;i不知道您正在尝试做什么。请发布您的输入图像以及来自ImageMagick和Photoshop的结果。以及您使用了哪些Photoshop命令来实现失真?也许您希望使用透视失真(-扭曲透视)在ImageMagick中,如果您有一组控制点。ImageMagick没有网格扭曲功能,如果您正试图这样做的话。@fmw42请检查UpdateManageMagick没有这样的功能。对不起,您可以尝试OpenCV或skImage。Shepards扭曲不会这样做。@fmw42除了Shepard之外,还有什么方法/技巧可以帮助您吗在ImageMagick中实现生成的图像/形状您使用的是bezier扭曲。ImageMagick没有。但是您可以尝试-扭曲多项式,二阶至少需要6个控制点。三阶需要10个。因此您有16个,这应该可以工作。我不知道您正在尝试做什么。请发布您的输入图像以及你从ImageMagick和Photoshop得到的结果。你使用了什么Photoshop命令来实现失真?也许你想使用透视失真(-扭曲透视)在ImageMagick中,如果您有一组控制点。ImageMagick没有网格扭曲功能,如果您正试图这样做的话。@fmw42请检查UpdateManageMagick没有这样的功能。对不起,您可以尝试OpenCV或skImage。Shepards扭曲不会这样做。@fmw42除了Shepard之外,还有什么方法/技巧可以帮助您吗在ImageMagick中实现生成的图像/形状您使用的是贝塞尔扭曲。ImageMagick没有贝塞尔扭曲。但是您可以尝试-扭曲多项式,二阶至少需要6个控制点。三阶需要10个。因此您有16个,这应该可以工作。请参阅
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