【问题标题】:How to map rectangle image to quadrilateral with PIL?如何使用 PIL 将矩形图像映射到四边形?
【发布时间】:2016-05-31 18:35:42
【问题描述】:

Python PIL 库允许我使用以下方法将图像中的任何四边形映射到矩形

im.transform(size, QUAD, data)

我需要的是一个相反的函数,即将一个矩形图像映射到指定的四边形。

我认为这可以通过上面提到的函数来实现,如下所示:

即我会找到这样的四边形(图像中的红色),它可以使用函数 im.transform(size, QUAD, data) 将图像转换为我想要的四边形。问题是我不知道如何找到红色四边形。

如果可能的话,我将不胜感激有关如何找到红色四边形或任何其他将矩形图像映射到四边形的方法的任何想法。

【问题讨论】:

  • 到目前为止我已经找到了这篇文章:fmwconcepts.com/imagemagick/bilinearwarp/….
  • 我自己从来没有这样做过。然而,阅读文档,似乎im.transform(size, PERSPECTIVE, data) image 正在做你试图实现的事情。

标签: python geometry python-imaging-library


【解决方案1】:

所以我用简单的正向映射解决了这个问题,而不是反向映射,这通常更好,但在我的应用程序中,我只将矩形映射到小于矩形的四边形,所以通常没有孔在转换后的图像中。代码如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多