python opencv在影象中裁剪任意形狀多邊形,裁剪鏤空多邊形, 裁剪多個多邊形
阿新 • • 發佈:2020-12-10
技術標籤: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,用原圖分別進行裁剪,然後做影象減法,最後再新增白色背景即可。這裡就不重複寫了。