opencv 图像不规则多边形填充

本文介绍了一种利用Python和OpenCV批量对图片进行选区填充的方法,通过自定义函数实现图片上的点绘制及区域填充,有效去除目标检测项目中的干扰区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

需要批量对图片进行选区填充,目标检测的一个项目中,去掉部分区域,避免干扰

效果

在这里插入图片描述
在这里插入图片描述

函数

画点

def draw_points(event, x, y, flags, param):  # 回调函数默认参数,无需修改
    global points, img  # 全局变量 要保持的点list,cv.imread读取的img
    point_size = 10  # 点半径
    point_color = (153, 51, 51)  # 蓝色
    thickness = 10  # 线条粗细
    if event == cv.EVENT_LBUTTONDBLCLK:
        # 左键双击,画出点,并保存到points中
        cv.circle(img, (x, y), point_size, point_color, thickness)
        points.append([x, y])

选区填充

def area_mask(img_path, area: np.ndarray, save_path, color=(0, 0, 0)):
	”“”
	area:np.array(points)
	color: 填充的颜色
	“”“
    img = cv.imread(img_path)
    img_filename = img_path.split("/")[-1]
    cv.fillPoly(img, [area, ], color)
    img_savepath = os.path.join(save_path, img_filename)
    cv.imwrite(img_savepath, img)

代码

import glob
import os
import time

import cv2 as cv
import numpy as np
from tqdm import tqdm


def mkdir(path):
    is_exits = os.path.exists(path)
    if not is_exits:
        os.makedirs(path)


def draw_points(event, x, y, flags, param):
    global points, img
    point_size = 10
    point_color = (153, 51, 51)  # 蓝色
    thickness = 10
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), point_size, point_color, thickness)
        points.append([x, y])


def area_mask(img_path, area: np.ndarray, save_path, color=(0, 0, 0)):
    img = cv.imread(img_path)
    img_filename = img_path.split("/")[-1]
    cv.fillPoly(img, [area, ], color)
    img_savepath = os.path.join(save_path, img_filename)
    cv.imwrite(img_savepath, img)


def get_points(img_path):
    global points, img
    cv.startWindowThread()
    cv.namedWindow('image', 0)
    cv.resizeWindow("image", 640, 480)
    cv.setMouseCallback('image', draw_points)

    img = cv.imread(img_path)
    while True:
        cv.imshow("image", img)
        k = cv.waitKey(1)
        if k & 0xFF == 27:
            break
    cv.destroyAllWindows()

    return np.array(points)


if __name__ == '__main__':
    global img
    points = []
    images_path = "./data/images/*.jpg"
    save_path = "./result/save"
    mkdir(save_path)

    image_path_list = glob.glob(images_path)
    area = get_points(image_path_list[0])
    for img_path in tqdm(image_path_list):
        area_mask(img_path, area, save_path, color=(0, 0, 0))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值