opencv 图像不规则多边形填充

需求

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

效果

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

函数

画点

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))


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中使用OpenCV进行不规则多边形ROI区域提取需要以下步骤: 1. 导入所需的库 我们需要导入OpenCV库,并将其命名为cv2。 2. 读取图像 使用cv2.imread()函数读取图像。这里假设图像文件名为"image.jpg"。 3. 创建ROI多边形 定义一个包含不规则多边形顶点的列表作为ROI区域。 4. 创建掩膜 使用cv2.fillPoly()函数创建一个与图像大小相同的空白图像,作为掩膜。然后使用cv2.fillPoly()函数在掩膜上填充多边形。 5. 应用掩膜 使用cv2.bitwise_and()函数将原始图像与掩膜进行按位与操作,即只保留ROI区域。 6. 显示结果 使用cv2.imshow()函数显示提取的ROI区域。 7. 释放窗口 使用cv2.waitKey(0)等待按下任意键后,使用cv2.destroyAllWindows()函数关闭窗口。 以下是一个简单的示例代码: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.jpg') # 创建ROI多边形 roi_vertices = np.array([[(100, 100), (300, 100), (200, 300), (50, 200)]], dtype=np.int32) # 创建掩膜 mask = np.zeros_like(image) cv2.fillPoly(mask, roi_vertices, 255) # 应用掩膜 roi_image = cv2.bitwise_and(image, mask) # 显示结果 cv2.imshow('ROI Image', roi_image) # 释放窗口 cv2.waitKey(0) cv2.destroyAllWindows() ``` 将以上代码保存为Python脚本,运行后会显示提取的ROI区域图像。其中,roi_vertices是一个包含多边形顶点的列表,可以根据需要调整顶点的坐标和个数来定义不规则多边形的形状。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值