在Python PIL(枕头)中进行网格变换后,如何计算特定点的位置?

2024-05-16 10:57:26 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我使用以下方法变换图像:

此代码取自此处:https://stackoverflow.com/a/37350619/259757

im_transformed = im.transform(im.size, Image.MESH, mesh)

给定原始图像中的特定坐标(x,y),如何计算im_变换后的新坐标?基本上,我可以将相同的变换应用于特定的单点,就像仿射变换一样

我想这样做的原因是,假设我知道图像中一张笑脸的位置。在第二张经过变换/扭曲的图像中,我想预测笑脸的位置,并将预测结果与应该的位置进行比较。我知道这并不精确,但我的想法是,我可以用已知的笑脸位置生成干净的图像,扭曲它们,并在x,y中有一个新的位置,笑脸应该在扭曲的图像中。这将允许我为机器学习模型生成训练数据

对于仿射变换,这非常简单,但是对于网格变换,我不知道如何做到这一点


Tags: 方法代码https图像imagecomsizetransform
1条回答
网友
1楼 · 发布于 2024-05-16 10:57:26

因此,在对PIL代码进行一点挖掘之后,我可以发现:

网格变换只是四边形变换的多种应用

每个四边形变换将源图像中的四边形映射到目标图像中的矩形

让我们看看什么是四元变换: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

问题是您需要从四边形中的点到矩形中的结果点的变换

所以你需要为x和y解以下方程(不是为x和y!!!!):

x_rect = a0 + a1*x + a2*y + a3*x*y;
y_rect = a4 + a5*x + a6*y + a7*x*y;

这个反演不是最好的,它给出了一个x和y的二次方程,所以你需要根据得到的坐标来决定采取哪种解决方案

有关详细解释,请参阅Answer

相关问题 更多 >