一、裁剪单个多边形

import numpy as np
import cv2

# 读取图像
img = cv2.imread("dog.jpg")
# 坐标点points
pts = np.array([[10, 10], [15, 0], [35, 8], [100, 20], [300, 45], [280, 100], [350, 230], [30, 200]])
pts = np.array([pts])
# 和原始图像一样大小的0矩阵,作为mask
mask = np.zeros(img.shape[:2], np.uint8)
# 在mask上将多边形区域填充为白色
cv2.polylines(mask, pts, 1, 255)    # 描绘边缘
cv2.fillPoly(mask, pts, 255)    # 填充
# 逐位与,得到裁剪后图像,此时是黑色背景
dst = cv2.bitwise_and(img, img, mask=mask)
# 添加白色背景
bg = np.ones_like(img, np.uint8) * 255
cv2.bitwise_not(bg, bg, mask=mask)  # bg的多边形区域为0,背景区域为255
dst_white = bg + dst

cv2.imwrite("mask.jpg", mask)
cv2.imwrite("dst.jpg", dst)
cv2.imwrite("dst_white.jpg", dst_white)

裁剪结果:

原图:

mask:

裁剪后:

 

二、裁剪多个多边形

已有多组坐标点bts,代表着多个多边形区域。

思路:对每组坐标点都在mask上进行相同的操作即可。这里就不重复写了。

三、裁剪镂空多边形

已有多组坐标点bts,其中一组表示最外层多边形,其余的表示镂空区域多边形。

思路1:对于最外层多边形在mask上进行白色填充(255);对于镂空区域多边形在mask上进行黑色填充(0)即可。这里就不重复写了。

思路2:对每个多边形区域都生成一个mask,用原图分别进行裁剪,然后做图像减法,最后再添加白色背景即可。这里就不重复写了。

本文地址:https://blog.csdn.net/PanYHHH/article/details/110940428