Photoshop warp alorithm
Photoshop warp alorithm
Hey guys,
I'm building a rendering tool which uses PSDs as source templates and IM as a rendering engine. I've succeeded reverse engineering PSD format and now get 16 control points for warp transformation of each layer in the PSD. However, when I try to apply it to source data I get very different results, mainly because I have no idea about what rendering algorithm does PS use. I'm quite sure about the numbers though.
Initially I thought this could be Shepards distortion but the order "3" polynomial transformation gives me much better results, however it's still quite far from perfect. See for yourself (PSD on the left, IM transformed rectangle on the right)
https://dl.dropbox.com/u/3204447/Screen ... 3%20PM.png
My question is: Does anyone know what transformation algorithm does PS use? Can it be replicated in IM with the same mesh? Any ideas?
Many thanks for your help.
I'm building a rendering tool which uses PSDs as source templates and IM as a rendering engine. I've succeeded reverse engineering PSD format and now get 16 control points for warp transformation of each layer in the PSD. However, when I try to apply it to source data I get very different results, mainly because I have no idea about what rendering algorithm does PS use. I'm quite sure about the numbers though.
Initially I thought this could be Shepards distortion but the order "3" polynomial transformation gives me much better results, however it's still quite far from perfect. See for yourself (PSD on the left, IM transformed rectangle on the right)
https://dl.dropbox.com/u/3204447/Screen ... 3%20PM.png
My question is: Does anyone know what transformation algorithm does PS use? Can it be replicated in IM with the same mesh? Any ideas?
Many thanks for your help.
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Photoshop warp alorithm
Yes
As you supply 16 points, and order 3 only needs 10. it does a 'best fit of the 16 points.
Note an order 4 polynomial requires a minimum of 15 points, as such in that algorithm the 'best fit' will be a lot closer.
By which I mean that the source point will more closely match the destination point.
The PS result however look like the result is a less closely fitting the distortion of of the control points you requested. perhaps it is quadratic (order 2) or even (reversed) bi-linear (order 1.5). I think it is the latter.
however as you only give a output image and not source data and image in a usable form, I can not experiment myself, without a lot of extra work.
To see exactly what distort is doing set -verbose
See IM Examples, Distorting Images
http://www.imagemagick.org/Usage/distort/#distort
As you supply 16 points, and order 3 only needs 10. it does a 'best fit of the 16 points.
Note an order 4 polynomial requires a minimum of 15 points, as such in that algorithm the 'best fit' will be a lot closer.
By which I mean that the source point will more closely match the destination point.
The PS result however look like the result is a less closely fitting the distortion of of the control points you requested. perhaps it is quadratic (order 2) or even (reversed) bi-linear (order 1.5). I think it is the latter.
however as you only give a output image and not source data and image in a usable form, I can not experiment myself, without a lot of extra work.
To see exactly what distort is doing set -verbose
See IM Examples, Distorting Images
http://www.imagemagick.org/Usage/distort/#distort
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Photoshop warp alorithm
My guess is that PS is using a 2D spline warping technique.
Re: Photoshop warp alorithm
Thanks! I'm going to experiment a bit further now, in the meantime...
My original CPs:
0: 0 x 0
1: 122 x 0
2: 244 x 0
3: 404 x -100.00000000000001
4: 0 x 84.33333333333333
5: 122 x 84.33333333333333
6: 244 x 84.33333333333333
7: 366 x 84.33333333333333
8: 0 x 168.66666666666666
9: 122 x 168.66666666666666
10: 244 x 168.66666666666666
11: 366 x 168.66666666666666
12: -80 x 354
13: 122 x 253
14: 244 x 253
15: 366 x 253
Test IM command:
convert warpmeh.png -gravity Center -extent 566x453 +repage +distort Polynomial '3 100,100,100,100 222,100,222,100 344,100,344,100 466,100,504,-1.4210854715202004e-14 100,184.33333333333331,100,184.33333333333331 222,184.33333333333331,222,184.33333333333331 344,184.33333333333331,344,184.33333333333331 466,184.33333333333331,466,184.33333333333331 100,268.66666666666663,100,268.66666666666663 222,268.66666666666663,222,268.66666666666663 344,268.66666666666663,344,268.66666666666663 466,268.66666666666663,466,268.66666666666663 100,353,20,454 222,353,222,353 344,353,344,353 466,353,466,353' +repage out.png
Src undistorted: https://dl.dropbox.com/u/3204447/warpmeh.png
PS render: https://dl.dropbox.com/u/3204447/ps-layers-1.png
IM output: https://dl.dropbox.com/u/3204447/out.png
My original CPs:
0: 0 x 0
1: 122 x 0
2: 244 x 0
3: 404 x -100.00000000000001
4: 0 x 84.33333333333333
5: 122 x 84.33333333333333
6: 244 x 84.33333333333333
7: 366 x 84.33333333333333
8: 0 x 168.66666666666666
9: 122 x 168.66666666666666
10: 244 x 168.66666666666666
11: 366 x 168.66666666666666
12: -80 x 354
13: 122 x 253
14: 244 x 253
15: 366 x 253
Test IM command:
convert warpmeh.png -gravity Center -extent 566x453 +repage +distort Polynomial '3 100,100,100,100 222,100,222,100 344,100,344,100 466,100,504,-1.4210854715202004e-14 100,184.33333333333331,100,184.33333333333331 222,184.33333333333331,222,184.33333333333331 344,184.33333333333331,344,184.33333333333331 466,184.33333333333331,466,184.33333333333331 100,268.66666666666663,100,268.66666666666663 222,268.66666666666663,222,268.66666666666663 344,268.66666666666663,344,268.66666666666663 466,268.66666666666663,466,268.66666666666663 100,353,20,454 222,353,222,353 344,353,344,353 466,353,466,353' +repage out.png
Src undistorted: https://dl.dropbox.com/u/3204447/warpmeh.png
PS render: https://dl.dropbox.com/u/3204447/ps-layers-1.png
IM output: https://dl.dropbox.com/u/3204447/out.png
- anthony
- Posts: 8883
- Joined: 2004-05-31T19:27:03-07:00
- Authentication code: 8675308
- Location: Brisbane, Australia
Re: Photoshop warp alorithm
Fred is right...
If it is fixed to 16 values, no more no less, than it is much more likely to be a 2D spline patch
We do not have a spline distort in IM at this time. Nor do we have other piece wise mesh distortion, though some people have done some work doing this as a IM wrapper, they have not published there technique/result where we have seen it.
If it is fixed to 16 values, no more no less, than it is much more likely to be a 2D spline patch
We do not have a spline distort in IM at this time. Nor do we have other piece wise mesh distortion, though some people have done some work doing this as a IM wrapper, they have not published there technique/result where we have seen it.
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
https://imagemagick.org/Usage/
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Photoshop warp alorithm
You could try my meshwarp at http://www.fmwconcepts.com/imagemagick/ ... /index.php if you are on Linux/Mac
It needs sets of triangles, but you can break the quadrilaterals into two triangles.
It needs sets of triangles, but you can break the quadrilaterals into two triangles.
Re: Photoshop warp alorithm
Thanks Fred, I just gave it a try and the result seems to be rather too triangulish
https://dl.dropbox.com/u/3204447/triangular-out.png
Do you guys have any ideas for other tools/libs that may be able to render this? I'm processing the whole job in a chain anyway and will use IM to decompose PSDs and stitch everything back together. This transformation is so far the only thing I have no idea how to do, and it's quite difficult for me as I'm pretty new to such low level image processing.
https://dl.dropbox.com/u/3204447/triangular-out.png
Do you guys have any ideas for other tools/libs that may be able to render this? I'm processing the whole job in a chain anyway and will use IM to decompose PSDs and stitch everything back together. This transformation is so far the only thing I have no idea how to do, and it's quite difficult for me as I'm pretty new to such low level image processing.
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Photoshop warp alorithm
Try ImageJ http://imagej.nih.gov/ij/ with the following plugins
http://biocomp.cnb.uam.es/~iarganda/bUnwarpJ/
or
http://bigwww.epfl.ch/thevenaz/UnwarpJ/
http://biocomp.cnb.uam.es/~iarganda/bUnwarpJ/
or
http://bigwww.epfl.ch/thevenaz/UnwarpJ/
Re: Photoshop warp alorithm
I have some progress, however, still no results. I did some more experiments and read a bit only to learn this probably isn't just a spline mesh or a simple polynomial transformation. When I play a bit with the CPs in Photoshop I get this:
https://dl.dropboxusercontent.com/u/320 ... 8%20PM.png
Some of the CPs are far away from the splines and they easily get far out from the layer. You can see it nicely on the test render of my detected coordinates:
https://dl.dropboxusercontent.com/u/320 ... 3%20PM.png
The point in the bottom left is the one you'd expect somewhere below W and A. After studying a bit I believe this is some sort of b-spline or NURBS mesh done in 2D. I know this a bit beyond IM scope, however, you may have some ideas how to render this thing. I don't think many 3D engines store data this way, the bézier / whatever approximation is usually done on top of a triangular mesh as it is much cheaper. Only thinking aloud though.
Any other ideas? Rendering this transformation is crucial to my whole project and this is already far beyond my math skills.
https://dl.dropboxusercontent.com/u/320 ... 8%20PM.png
Some of the CPs are far away from the splines and they easily get far out from the layer. You can see it nicely on the test render of my detected coordinates:
https://dl.dropboxusercontent.com/u/320 ... 3%20PM.png
The point in the bottom left is the one you'd expect somewhere below W and A. After studying a bit I believe this is some sort of b-spline or NURBS mesh done in 2D. I know this a bit beyond IM scope, however, you may have some ideas how to render this thing. I don't think many 3D engines store data this way, the bézier / whatever approximation is usually done on top of a triangular mesh as it is much cheaper. Only thinking aloud though.
Any other ideas? Rendering this transformation is crucial to my whole project and this is already far beyond my math skills.
- fmw42
- Posts: 25562
- Joined: 2007-07-02T17:14:51-07:00
- Authentication code: 1152
- Location: Sunnyvale, California, USA
Re: Photoshop warp alorithm
If it has tangent points, it could be a bezier spline mesh. But it is really hard to know what they did in terms of reverse engineering. And certainly IM does not have that. I guess with enough control points you might get the polynomial distort to come close.
Re: Photoshop warp alorithm
Thanks!
If there's any image processing genius reading this who finds the problem interesting, would be able to puzzle it down and turn the resulting transformation into a single purpose program (written in language of your choice), please drop me a line at mirek@openbrand.com
If there's any image processing genius reading this who finds the problem interesting, would be able to puzzle it down and turn the resulting transformation into a single purpose program (written in language of your choice), please drop me a line at mirek@openbrand.com