1. 程式人生 > 其它 >python opencv在影象中裁剪任意形狀多邊形,裁剪鏤空多邊形, 裁剪多個多邊形

python opencv在影象中裁剪任意形狀多邊形,裁剪鏤空多邊形, 裁剪多個多邊形

技術標籤:python

一、裁剪單個多邊形

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,用原圖分別進行裁剪,然後做影象減法,最後再新增白色背景即可。這裡就不重複寫了。