繁体   English   中英

如何在 Python PIL(枕头)中计算特定点的位置?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM