python 按照四个点的坐标裁剪不规则四边形

参考连接 https://www.jianshu.com/p/f3c73fc54625
代码实现

import math

from PIL import Image, ImageDraw


class Rotate(object):

    def __init__(self, image: Image.Image, coordinate):
        self.image = image.convert('RGB')
        self.coordinate = coordinate
        self.xy = [tuple(self.coordinate[k]) for k in ['left_top', 'right_top', 'right_bottom', 'left_bottom']]
        self._mask = None
        self.image.putalpha(self.mask)

    @property
    def mask(self):
        if not self._mask:
            mask = Image.new('L', self.image.size, 0)
            draw = ImageDraw.Draw(mask, 'L')
            draw.polygon(self.xy, fill=255)
            self._mask = mask
        return self._mask

    def run(self):
        image = self.rotation_angle()
        box = image.getbbox()
        return image.crop(box)

    def rotation_angle(self):
        x1, y1 = self.xy[0]
        x2, y2 = self.xy[1]
        angle = self.angle([x1, y1, x2, y2], [0, 0, 10, 0]) * -1
        return self.image.rotate(angle, expand=True)

    def angle(self, v1, v2):
        dx1 = v1[2] - v1[0]
        dy1 = v1[3] - v1[1]
        dx2 = v2[2] - v2[0]
        dy2 = v2[3] - v2[1]
        angle1 = math.atan2(dy1, dx1)
        angle1 = int(angle1 * 180 / math.pi)
        angle2 = math.atan2(dy2, dx2)
        angle2 = int(angle2 * 180 / math.pi)
        if angle1 * angle2 >= 0:
            included_angle = abs(angle1 - angle2)
        else:
            included_angle = abs(angle1) + abs(angle2)
            if included_angle > 180:
                included_angle = 360 - included_angle
        return included_angle


if __name__ == '__main__':
    image = Image.open('/Downloads/test/01-90_78-181&326_369&395-358&386_193&385_184&338_349&340-0_0_23_25_33_30_9-94-13.jpg')
    coordinate = {'left_top': [184, 338], 'right_top': [349, 340], 'right_bottom': [358, 386], 'left_bottom': [193, 385]}
    rotate = Rotate(image, coordinate)
    rotate.run().convert('RGB').save('./1.jpg')
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,您可以使用 Pillow 库进行图像处理和裁剪。为了使用不规则四边形的四坐标进行裁剪,您可以执行以下步骤: 1. 首先,您需要安装 Pillow 库。您可以在命令行中运行以下命令来安装它: ``` pip install pillow ``` 2. 接下来,您需要打开要裁剪的图像。您可以使用 Pillow 库中的 `Image` 类来打开图像,如下所示: ```python from PIL import Image image = Image.open("path/to/image.jpg") ``` 3. 然后,您需要定义不规则四边形四个坐标。您可以将这些坐标存储在一个列表中,如下所示: ```python points = [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] ``` 其中 `(x1, y1)`、`(x2, y2)`、`(x3, y3)` 和 `(x4, y4)` 是不规则四边形四个坐标。 4. 接下来,您可以使用 `ImageDraw` 类从图像中提取不规则四边形区域。您可以按以下方式执行此操作: ```python from PIL import ImageDraw mask = Image.new("L", image.size, 0) draw = ImageDraw.Draw(mask) draw.polygon(points, fill=255) image.putalpha(mask) ``` 这将创建一个与原始图像大小相同的新图像,其中不规则四边形区域被提取并设置为不透明。最终图像的其他区域将被设置为透明。 5. 最后,您可以保存裁剪后的图像。您可以按以下方式执行此操作: ```python image.save("path/to/cropped_image.png") ``` 这将保存裁剪后的图像为 PNG 格式。 完整代码示例: ```python from PIL import Image, ImageDraw # 打开图像 image = Image.open("path/to/image.jpg") # 定义不规则四边形四个坐标 points = [(x1, y1), (x2, y2), (x3, y3), (x4, y4)] # 从图像中提取不规则四边形区域 mask = Image.new("L", image.size, 0) draw = ImageDraw.Draw(mask) draw.polygon(points, fill=255) image.putalpha(mask) # 保存裁剪后的图像 image.save("path/to/cropped_image.png") ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值