opencv-python给图片添加半透明mask
·
思路:
- 读取原始图片
- 根据给定坐标信息,绘制mask
- 将原始图片与mask融合
如果对目标检测中的bounding boxes绘制感兴趣的话,可以参考:PIL与opencv绘制bounding box(带文本标签)的比较
两张图解释为什么要绘制mask:


直接在原图绘制,会被遮挡
矩形mask
原始图片:
import numpy as np
import os
import cv2
def put_mask(img_path,output_fold):
# 1.读取图片
image = cv2.imread(img_path)
# 2.获取标签
# 标签格式 bbox = [xl, yl, xr, yr]
bbox1 = [72,41,208,330]
bbox2 = [100,80,248,334]
# 3.画出mask
zeros1 = np.zeros((image.shape), dtype=np.uint8)
zeros2 = np.zeros((image.shape), dtype=np.uint8)
zeros_mask1 = cv2.rectangle(zeros1, (bbox1[0], bbox1[1]), (bbox1[2], bbox1[3]),
color=(0,0,255), thickness=-1 ) #thickness=-1 表示矩形框内颜色填充
zeros_mask2 = cv2.rectangle(zeros2, (bbox2[0], bbox2[1]), (bbox2[2], bbox2[3]),
color=(0, 255, 0), thickness=-1)
zeros_mask = np.array((zeros_mask1 + zeros_mask2))
try:
# alpha 为第一张图片的透明度
alpha = 1
# beta 为第二张图片的透明度
beta = 0.5
gamma = 0
# cv2.addWeighted 将原始图片与 mask 融合
mask_img = cv2.addWeighted(image, alpha, zeros_mask, beta, gamma)
cv2.imwrite(os.path.join(output_fold,'mask_img.jpg'), mask_img)
except:
print('异常')
put_mask(img_path = '107.jpg', output_fold='./')
添加mask后的图片:
如果将绘制mask的代码更改,mask的重叠部分,会变为后绘制的颜色:
# 3.画出mask
zeros1 = np.zeros((image.shape), dtype=np.uint8)
zeros_mask1 = cv2.rectangle(zeros1, (bbox1[0], bbox1[1]), (bbox1[2], bbox1[3]),
color=(0,0,255), thickness=-1 ) #thickness=-1 表示矩形框内颜色填充
zeros_mask2 = cv2.rectangle(zeros_mask1, (bbox2[0], bbox2[1]), (bbox2[2], bbox2[3]),
color=(0, 255, 0), thickness=-1)
zeros_mask = zeros_mask2

不规则点的mask
原始图片:

未填充
import json
import numpy as np
import os
from PIL import Image
import matplotlib.pyplot as plt
import cv2
def process_points(im_path,points,output_path):
# 获取坐标信息,
points = np.array([points], dtype=np.int32)
# 读取图片名
img = cv2.imread(im_path)
# # 绘制mask
# zeros = np.zeros((img.shape), dtype=np.uint8)
# 原本thickness = -1表示内部填充,这里不知道为什么会报错,只好不填充了
cv2.polylines(img, points, isClosed=True, thickness=5, color=(144, 238, 144))
cv2.imwrite(os.path.join(output_path, 'handsome.jpg'), img)
# 这是我用labelme画的不规则点坐标
points = [[14.222222222222229, 1076.111111111111], [133.1111111111111, 849.4444444444445],
[240.8888888888889, 776.1111111111111], [252.0, 737.2222222222222],
[253.1111111111111, 619.4444444444445], [298.66666666666663, 569.4444444444445],
[298.66666666666663, 530.5555555555555], [270.8888888888889, 483.88888888888886],
[247.55555555555554, 355.0], [242.0, 221.66666666666666], [282.0, 188.33333333333331],
[332.0, 206.11111111111111], [388.66666666666663, 243.88888888888889],
[433.1111111111111, 182.77777777777777], [457.55555555555554, 93.88888888888889],
[480.8888888888889, 2.7777777777777777], [512.0, 6.111111111111111],
[536.4444444444445, 82.77777777777777], [596.4444444444445, 168.33333333333334],
[683.1111111111111, 171.66666666666666], [746.4444444444443, 227.22222222222223],
[794.2222222222222, 296.1111111111111], [850.8888888888889, 359.44444444444446],
[837.5555555555554, 413.88888888888886], [840.8888888888889, 465.0], [792.0, 519.4444444444445],
[867.5555555555554, 686.1111111111111], [899.7777777777778, 1010.5555555555555],
[879.7777777777778, 1076.111111111111]]
process_points(im_path='./zhong.jpg',points=points,output_path='./')
填充
替换以上几行代码即可
# # 绘制mask
zeros = np.zeros((img.shape), dtype=np.uint8)
# 原本thickness = -1表示内部填充
mask = cv2.fillPoly(zeros, points, color=(0, 165, 255))
mask_img = 0.3*mask + img
cv2.imwrite(os.path.join(output_path, 'handsome.jpg'), mask_img)
分哥的盛世美颜是真帅啊!!!
更多推荐

所有评论(0)