Python PIL库允许我使用
将图像中的任何四边形映射到矩形im.transform(size, QUAD, data)
我需要的是一个相反的功能,即将矩形图像映射到指定的四边形。
我认为这可以通过上述功能实现:
即。我会发现这样的四边形(图像中的红色),使用函数im.transform(size,QUAD,data)将图像转换为我想要的四边形。问题是我不知道如何找到红色四边形。
我很感激如何找到红色四边形或任何其他方式将矩形图像映射到四边形,如果可能的话只能用PIL。
答案 0 :(得分:2)
所以我用简单的前向映射解决了这个问题,而不是逆映射,这通常更好,但在我的应用程序中我只将矩形映射到小于矩形的四边形,所以通常没有孔在转换后的图像中。代码如下:
def reverse_quad_transform(image, quad_to_map_to, alpha):
# forward mapping, for simplicity
result = Image.new("RGBA",image.size)
result_pixels = result.load()
width, height = result.size
for y in range(height):
for x in range(width):
result_pixels[x,y] = (0,0,0,0)
p1 = (quad_to_map_to[0],quad_to_map_to[1])
p2 = (quad_to_map_to[2],quad_to_map_to[3])
p3 = (quad_to_map_to[4],quad_to_map_to[5])
p4 = (quad_to_map_to[6],quad_to_map_to[7])
p1_p2_vec = (p2[0] - p1[0],p2[1] - p1[1])
p4_p3_vec = (p3[0] - p4[0],p3[1] - p4[1])
for y in range(height):
for x in range(width):
pixel = image.getpixel((x,y))
y_percentage = y / float(height)
x_percentage = x / float(width)
# interpolate vertically
pa = (p1[0] + p1_p2_vec[0] * y_percentage, p1[1] + p1_p2_vec[1] * y_percentage)
pb = (p4[0] + p4_p3_vec[0] * y_percentage, p4[1] + p4_p3_vec[1] * y_percentage)
pa_to_pb_vec = (pb[0] - pa[0],pb[1] - pa[1])
# interpolate horizontally
p = (pa[0] + pa_to_pb_vec[0] * x_percentage, pa[1] + pa_to_pb_vec[1] * x_percentage)
try:
result_pixels[p[0],p[1]] = (pixel[0],pixel[1],pixel[2],min(int(alpha * 255),pixel[3]))
except Exception:
pass
return result