[英]How can I compute the location of a specific point after a mesh transformation in Python PIL (Pillow)?
如果我使用以下方法转换图像:
此代码取自此处: https://stackoverflow.com/a/37350619/259757
im_transformed = im.transform(im.size, Image.MESH, mesh)
给定原始图像中的特定坐标 (x,y),我如何计算 im_transformed 中的新坐标? 基本上我可以像仿射变换一样将相同的变换应用于特定的单点吗?
我想要这样做的原因是,可以说我知道图像中一张笑脸的位置。 在已经转换/扭曲的第二张图像中,我想预测那个笑脸在哪里,并将预测与它应该在哪里进行比较。 我知道它不准确,但我的想法是我可以生成具有已知位置的笑脸的干净图像,扭曲它们并在 x,y 中有一个新位置,笑脸应该在扭曲的图像中。 这将允许我为机器学习 model 生成训练数据。
对于仿射变换,这非常简单,但对于网格变换,我不知道该怎么做。
因此,在对 PIL 代码进行了一些挖掘之后,这就是我能找到的:
MESH 变换只是 QUAD 变换的多重应用。
每个 QUAD 变换将源图像中的四边形映射到目标图像中的矩形。
那么让我们看看什么是 QUAD 变换: PIL quad transform
quad_transform(double* xin, double* yin, int x, int y, void* data) {
double* a = (double*) data;
double a0 = a[0]; double a1 = a[1]; double a2 = a[2]; double a3 = a[3];
double a4 = a[4]; double a5 = a[5]; double a6 = a[6]; double a7 = a[7];
xin[0] = a0 + a1*x + a2*y + a3*x*y;
yin[0] = a4 + a5*x + a6*y + a7*x*y;
return 1;
}
这是一个逆映射,它告诉如何对源图像中的一个点进行采样以获得目标图像中位置 xin,yin 的像素。
参数是按以下方式计算的,我重写了它,使它看起来更好:
def get_parameters(rectangle, quadrilateral):
w = rectangle[2] - rectangle[0]
h = rectangle[3] - rectangle[1]
nw = quadrilateral[0:2] # The quadrilateral coordinates
sw = quadrilateral[2:4] # The quadrilateral coordinates
se = quadrilateral[4:6] # The quadrilateral coordinates
ne = quadrilateral[6:8] # The quadrilateral coordinates
x0, y0 = nw
As = 1.0 / w
At = 1.0 / h
parameters = (
x0, # a0
(ne[0] - x0) * As, # a1,
(sw[0] - x0) * At, # a2
(se[0] - sw[0] - ne[0] + x0) * As * At, # a3
y0, # a4
(ne[1] - y0) * As, # a5
(sw[1] - y0) * At, # a6
(se[1] - sw[1] - ne[1] + y0) * As * At, # a7
)
return parameters
问题是您希望将 QUAD 中的点转换为矩形中的结果点。
因此,您需要为 x 和 y 求解以下方程(不适用于 x_rect 和 y_rect:!!!):
x_rect = a0 + a1*x + a2*y + a3*x*y;
y_rect = a4 + a5*x + a6*y + a7*x*y;
这种反演不是最好的,它会为您提供 x 和 y 的二次方程,因此您需要根据结果坐标决定采用哪种解决方案。
有关完整说明,请查看答案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.