思路:

  1. 读取原始图片
  2. 根据给定坐标信息,绘制mask
  3. 将原始图片与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)

分哥的盛世美颜是真帅啊!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐