Photoshop中的图像变形算法?

时间:2021-05-25 03:54:09
大家好,有没有人知道photoshop中*变换中变形的相关算法原理?
[img=http://api.photoshop.com/home_25915c48b4784336a1fdcea33e77f3b0/adobe-px-assets/9430a43ea56641d5998b82aae39f4d5b][/img]

24 个解决方案

#1


都是很基本的图像变换!
平移、旋转、拉伸、压缩这些!

#2


能说明白点么??

#3


楼上说的不对,其实所有的变换都是可以或者近似用一个方程来描述的
如果X2 = a1*X1 + b1*Y1 + C1;
Y2 = a2*X1 + b2*Y1 + C2;
这样一个方程组,不同的a b c就能够组成不同的变换(实际上这个方程能够组成所有的一维变换,平移、仿射、对称、放大缩小等等)
对于上面楼主的实例,实际上PS是使用更高阶的方程组来描述这个变换而已,所谓最终就是确定方程的阶数和方程的参数,给一个通用的方程描述:
X2 = A1*X(n) + A2*X(n-1)+……+AnX(0)+B1*Y(n)+ B2*Y(n-1)……+C1*X(1)*Y(N-1)+……
Y2=……                 x(n)表示X的N次方
类似的一个变换就能描述对图像的变换了,楼主的实例是进行了多个变换。一般来说2维变换就可以满足要求了,也就是方程的最高阶为2

#4


图片看不到!

#5


up

#6


桃子里的虫,你的意思是说插值的时候用的方程么,比如说双线性插值。

#7


fandh可以看这里,在GOOGLE上找的 ,就是Photoshop里面的warp变形。
http://images.google.cn/imglanding?q=photoshop%20warp&imgurl=http://images.digitalmedianet.com/2005/Week_15/s9443bf6/story/ps09-warp1.jpg&imgrefurl=http://corporatemedianews.digitalmedianet.com/articles/viewarticle.jsp%3Fid%3D31601-1&usg=__nfVYMTXipwJMcmyG-6NkTCPnGf4=&h=537&w=332&sz=18&hl=zh-CN&tbnid=-oPMXetVjStRoM:&tbnh=132&tbnw=82&prev=/images%3Fq%3Dphotoshop%2Bwarp%26gbv%3D2%26ndsp%3D21%26hl%3Dzh-CN%26sa%3DN%26start%3D63%26newwindow%3D1&gbv=2&ndsp=21&sa=N&start=60&newwindow=1#tbnid=-oPMXetVjStRoM&start=64
[img=http://images.google.cn/imglanding?q=photoshop%20warp&imgurl=http://images.digitalmedianet.com/2005/Week_15/s9443bf6/story/ps09-warp1.jpg&imgrefurl=http://corporatemedianews.digitalmedianet.com/articles/viewarticle.jsp%3Fid%3D31601-1&usg=__nfVYMTXipwJMcmyG-6NkTCPnGf4=&h=537&w=332&sz=18&hl=zh-CN&tbnid=-oPMXetVjStRoM:&tbnh=132&tbnw=82&prev=/images%3Fq%3Dphotoshop%2Bwarp%26gbv%3D2%26ndsp%3D21%26hl%3Dzh-CN%26sa%3DN%26start%3D63%26newwindow%3D1&gbv=2&ndsp=21&sa=N&start=60&newwindow=1#tbnid=-oPMXetVjStRoM&start=64][/img]

#8


ding 一 ding, 别沉了。

#9


其实可以理解为插值,但是我的插值和你的不一样,上面的算法如果X2 Y2都取整数,那么所得的结果就是用最邻近插值下的图像变换,方程表示的是一种变换。(宏观上的,大于像素)
插值其实就是微观上的图形变换。(小于像素)

#10


我现在不懂的就是,在Photoshop里面,拖拽外面的控制点,周边的曲线会变化,就跟BEZIER曲线差不多,而且里面的曲线也会跟BEZIER曲线一样,跟着变形,同时下面的图像就会变形。这是怎么插值的??我这个不懂。

#11


这个问题的核心就是方程的阶数和参数,我认为这个方程的阶数为2就够了。也就是说最后的形式是
X2 = A1*X(2)+A2*Y(2)+A3*X*Y+A4*X+A5*Y+A6
Y2 = B1*X(2)+……+B6
确定A1-A6,B1-B6就相当于确定了这一组变换。
当然他使用的模型可能更加简单,也就是说AB中有些为0.
具体模型是什么样我这里也无法猜测。至于你拉动一些点,然后图形就变换,其实这些点是用来计算AB这些
参数使用的,所以点位变了之后,变换模型也就变了,如果你理解BEZIER曲线,那就是点的一维控制(控制斜率),变成了点控制二维的面而已。

所以,你要完成以上的工作的话,首先确定一个变换模型,然后确定若干个控制点,控制点坐标计算模型变换参数。
我说的应该够详细了吧。剩下的就是确定一个模型,设置一些控制点来控制模型参数(这个部分比较复杂)

#12


不太懂,现在想确定这个变换模型,就是每次移动控制点的时候,根据这些控制点来计算变换方程的参数 ,然后对非控制点进行插值,生成变形后的图像。但我每次只移动了一点啊,怎么能求的出这么多的参数呢?

#13


所有的点都是参与计算的,但是你移动一个点,计算结果就改变了。

#14


比如说最上面的一条横边把,如果我拉动左上角的控制点,这条横边会变成BEZIER曲线状,成弯曲的了。但此时我只知道我拉动的点的位移,其他点参与运算,我也不知道他们的位移啊。

#15


顶一下,别沉罗。

#16


这么说吧,最简单的线性模型。你拉动最上面的边,那么从最上面线条到最下面的线条的距离就不一样了{Y值}
设置原来为Y,移动之后为Y1,你使用直接压缩的方式,将Y个像素插值到Y1个单元格内,就完成了你所要的效果,当然这个模型是最简单的一次模型。也就是Y = A*Y;
明白了没,今天不早了。回答了这么多也不给点分,不懂留言吧,明天再回

#17


给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

#18


引用 17 楼 hfutqianwei 的回复:
给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

哈哈哈哈

#19


引用 18 楼 fandh 的回复:
引用 17 楼 hfutqianwei 的回复:
 给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

 哈哈哈哈

你也很热情,照样给分。

#20


这种问题是找不到代码的。

#21


引用 20 楼 laviewpbt 的回复:
这种问题是找不到代码的。

我不需要代码,只想知道算法思路。

#22


楼主搞定没,给这么多分,必须卖力a
给你一点试探性的建议吧,你先做一个矩形,矩形的4边是4条BEZIER曲线,围成的框内就是一个图像。

四条曲线端点位置固定,直线内的控制点可以移动(用来控制图片变形),然后Y方向是由上下两天曲线控制,X方向由左右两条曲线控制(图像边缘始终与曲线重合)

X = 某固定值(P),LY是指从上曲线X固定值(P)的点到下曲线X固定值(P)的点的Y值的差(设为LY(P)),原始矩形的高为LY(0),对于每一个X(也就是P从矩形最左到最右),都使用原图像插值到扩展后的空间(Y(0)->Y(P))
对于Y=固定值,LX类似的处理,就完成了一个最简单的变化。

#23


恩,有点感觉哈。不过你说的,是假设只有周边的四个BEZIER边变形,而整个网格中间的几条交叉边是不会变形的,依然是直线。现在PHOTOSHOP里面的网格中每一条线都能进行类似于BEZIER曲线的变换。

#24


你说,他这个会不会用了BEZIER曲面的知识??其实你这个效果图,其实就是一个BEZIER曲线交错成的曲面啊。

#1


都是很基本的图像变换!
平移、旋转、拉伸、压缩这些!

#2


能说明白点么??

#3


楼上说的不对,其实所有的变换都是可以或者近似用一个方程来描述的
如果X2 = a1*X1 + b1*Y1 + C1;
Y2 = a2*X1 + b2*Y1 + C2;
这样一个方程组,不同的a b c就能够组成不同的变换(实际上这个方程能够组成所有的一维变换,平移、仿射、对称、放大缩小等等)
对于上面楼主的实例,实际上PS是使用更高阶的方程组来描述这个变换而已,所谓最终就是确定方程的阶数和方程的参数,给一个通用的方程描述:
X2 = A1*X(n) + A2*X(n-1)+……+AnX(0)+B1*Y(n)+ B2*Y(n-1)……+C1*X(1)*Y(N-1)+……
Y2=……                 x(n)表示X的N次方
类似的一个变换就能描述对图像的变换了,楼主的实例是进行了多个变换。一般来说2维变换就可以满足要求了,也就是方程的最高阶为2

#4


图片看不到!

#5


up

#6


桃子里的虫,你的意思是说插值的时候用的方程么,比如说双线性插值。

#7


fandh可以看这里,在GOOGLE上找的 ,就是Photoshop里面的warp变形。
http://images.google.cn/imglanding?q=photoshop%20warp&imgurl=http://images.digitalmedianet.com/2005/Week_15/s9443bf6/story/ps09-warp1.jpg&imgrefurl=http://corporatemedianews.digitalmedianet.com/articles/viewarticle.jsp%3Fid%3D31601-1&usg=__nfVYMTXipwJMcmyG-6NkTCPnGf4=&h=537&w=332&sz=18&hl=zh-CN&tbnid=-oPMXetVjStRoM:&tbnh=132&tbnw=82&prev=/images%3Fq%3Dphotoshop%2Bwarp%26gbv%3D2%26ndsp%3D21%26hl%3Dzh-CN%26sa%3DN%26start%3D63%26newwindow%3D1&gbv=2&ndsp=21&sa=N&start=60&newwindow=1#tbnid=-oPMXetVjStRoM&start=64
[img=http://images.google.cn/imglanding?q=photoshop%20warp&imgurl=http://images.digitalmedianet.com/2005/Week_15/s9443bf6/story/ps09-warp1.jpg&imgrefurl=http://corporatemedianews.digitalmedianet.com/articles/viewarticle.jsp%3Fid%3D31601-1&usg=__nfVYMTXipwJMcmyG-6NkTCPnGf4=&h=537&w=332&sz=18&hl=zh-CN&tbnid=-oPMXetVjStRoM:&tbnh=132&tbnw=82&prev=/images%3Fq%3Dphotoshop%2Bwarp%26gbv%3D2%26ndsp%3D21%26hl%3Dzh-CN%26sa%3DN%26start%3D63%26newwindow%3D1&gbv=2&ndsp=21&sa=N&start=60&newwindow=1#tbnid=-oPMXetVjStRoM&start=64][/img]

#8


ding 一 ding, 别沉了。

#9


其实可以理解为插值,但是我的插值和你的不一样,上面的算法如果X2 Y2都取整数,那么所得的结果就是用最邻近插值下的图像变换,方程表示的是一种变换。(宏观上的,大于像素)
插值其实就是微观上的图形变换。(小于像素)

#10


我现在不懂的就是,在Photoshop里面,拖拽外面的控制点,周边的曲线会变化,就跟BEZIER曲线差不多,而且里面的曲线也会跟BEZIER曲线一样,跟着变形,同时下面的图像就会变形。这是怎么插值的??我这个不懂。

#11


这个问题的核心就是方程的阶数和参数,我认为这个方程的阶数为2就够了。也就是说最后的形式是
X2 = A1*X(2)+A2*Y(2)+A3*X*Y+A4*X+A5*Y+A6
Y2 = B1*X(2)+……+B6
确定A1-A6,B1-B6就相当于确定了这一组变换。
当然他使用的模型可能更加简单,也就是说AB中有些为0.
具体模型是什么样我这里也无法猜测。至于你拉动一些点,然后图形就变换,其实这些点是用来计算AB这些
参数使用的,所以点位变了之后,变换模型也就变了,如果你理解BEZIER曲线,那就是点的一维控制(控制斜率),变成了点控制二维的面而已。

所以,你要完成以上的工作的话,首先确定一个变换模型,然后确定若干个控制点,控制点坐标计算模型变换参数。
我说的应该够详细了吧。剩下的就是确定一个模型,设置一些控制点来控制模型参数(这个部分比较复杂)

#12


不太懂,现在想确定这个变换模型,就是每次移动控制点的时候,根据这些控制点来计算变换方程的参数 ,然后对非控制点进行插值,生成变形后的图像。但我每次只移动了一点啊,怎么能求的出这么多的参数呢?

#13


所有的点都是参与计算的,但是你移动一个点,计算结果就改变了。

#14


比如说最上面的一条横边把,如果我拉动左上角的控制点,这条横边会变成BEZIER曲线状,成弯曲的了。但此时我只知道我拉动的点的位移,其他点参与运算,我也不知道他们的位移啊。

#15


顶一下,别沉罗。

#16


这么说吧,最简单的线性模型。你拉动最上面的边,那么从最上面线条到最下面的线条的距离就不一样了{Y值}
设置原来为Y,移动之后为Y1,你使用直接压缩的方式,将Y个像素插值到Y1个单元格内,就完成了你所要的效果,当然这个模型是最简单的一次模型。也就是Y = A*Y;
明白了没,今天不早了。回答了这么多也不给点分,不懂留言吧,明天再回

#17


给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

#18


引用 17 楼 hfutqianwei 的回复:
给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

哈哈哈哈

#19


引用 18 楼 fandh 的回复:
引用 17 楼 hfutqianwei 的回复:
 给分,给分,你太热情了,当然给分。谢谢桃子里的虫哈,我先消化消化,如果不懂给你留言。

 哈哈哈哈

你也很热情,照样给分。

#20


这种问题是找不到代码的。

#21


引用 20 楼 laviewpbt 的回复:
这种问题是找不到代码的。

我不需要代码,只想知道算法思路。

#22


楼主搞定没,给这么多分,必须卖力a
给你一点试探性的建议吧,你先做一个矩形,矩形的4边是4条BEZIER曲线,围成的框内就是一个图像。

四条曲线端点位置固定,直线内的控制点可以移动(用来控制图片变形),然后Y方向是由上下两天曲线控制,X方向由左右两条曲线控制(图像边缘始终与曲线重合)

X = 某固定值(P),LY是指从上曲线X固定值(P)的点到下曲线X固定值(P)的点的Y值的差(设为LY(P)),原始矩形的高为LY(0),对于每一个X(也就是P从矩形最左到最右),都使用原图像插值到扩展后的空间(Y(0)->Y(P))
对于Y=固定值,LX类似的处理,就完成了一个最简单的变化。

#23


恩,有点感觉哈。不过你说的,是假设只有周边的四个BEZIER边变形,而整个网格中间的几条交叉边是不会变形的,依然是直线。现在PHOTOSHOP里面的网格中每一条线都能进行类似于BEZIER曲线的变换。

#24


你说,他这个会不会用了BEZIER曲面的知识??其实你这个效果图,其实就是一个BEZIER曲线交错成的曲面啊。