找了一圈网上类似的做法,很少有资料使用python CV2去操作的,基本上都是使用C++ opencv 的CopyTo函数
这里简单记录一下实现过程:
上图,这里是一张200 x 200 x 3的图(图一):
我们现在有多个不规则点围成的图形 [50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]
大致勾勒出来的图像如图所示(图二):
我们先对图一简单处理下得到它的mask图
img = cv2.imread(r'C:\Users\User\Desktop\1.jpg')
a = np.array([[[50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]]], dtype = np.int32)
x_data = []
y_data = []
for i1 in a:
for i2 in i1:
x_data.append(i2[0])
y_data.append(i2[1])
pts = np.vstack((np.array(x_data), np.array(y_data))).astype(np.int32).T
w = 200
h = 200
mask = np.zeros((h, w), dtype=np.uint8)
cv2.fillPoly(mask, [pts], (255, 255, 255), 8, 0)
cv2.imwrite(r'C:\Users\User\Desktop\3_mask.jpg', mask)
处理完写在本地的3_mask.jpg(图三)如下图所示:
我们再简单实现以下要在ROI上做的绘图逻辑(我这里实现的是斜线填充,可以改成任意:比如改颜色加滤镜)
draw_img = img.copy()
for i in range(0, 200, 10):
point1 = (i, 200)
point2 = (200, i)
cv2.line(draw_img, point1, point2, (0, 0, 255), 1)
point1 = (0, i)
point2 = (i, 0)
cv2.line(draw_img, point1, point2, (0, 0, 255), 1)
cv2.imwrite(r'C:\Users\User\Desktop\1111_res.jpg', draw_img)
此时,得到的1111_res.jpg(图四)如下图:
接着,对图四做mask图的与操作:
mask_res = cv2.bitwise_and(draw_img, draw_img, mask=mask)
cv2.imwrite(r'C:\Users\User\Desktop\4_res.jpg', mask_res)
得到图五,如下所示:
最骚的操作来了,在原图(即图一)上,画出反向mask的部分且涂黑
img66 = cv2.imread(r'C:\Users\User\Desktop\1.jpg')
a = np.array([[[50,50], [100,50], [100,20], [150,20], [150, 150], [100, 150], [100, 70], [50, 70]]], dtype = np.int32)
cv2.polylines(img66, a, True, (255, 255, 255), 1)
cv2.fillPoly(img66, a, (0, 0, 0)) # 纯色填充
cv2.imwrite(r'C:\Users\User\Desktop\5_res.jpg', img66)
得到图六:
最后:把图五图六做像素相加:
res = cv2.add(mask_res, img66)
cv2.imwrite(r'C:\Users\User\Desktop\6_res.jpg', res)
上结果图(图七):
是不是很神奇?这是针对非规则ROI的处理,矩形ROI的网上一堆,请自行百度。