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