簡體   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