在掩码区域内填充圆形

在掩码区域内填充一个圆形

在进行halcon位姿估计时,因为使用物体的纹理信息,可能出现陷入局部最优的问题。
在这里插入图片描述

因此填充一些其他形状的掩码,破坏纹理,避免陷入局部最优,代码如下:

代码中使用了物体的掩码获取物体轮廓,在轮廓内寻找中心点,以该中心点画圆,破坏了原有的纹理特征。
在这里插入图片描述

# 对掩码区域内部图像进行填充,填充为白色圆形 避免白色的
import cv2
import numpy as np
import matplotlib.pyplot as plt
import os
import sys
import math
from tqdm import tqdm



def mask_white(img, mask):
    """
    在掩码区域内部填充最大轮廓对应的圆形。本函数读入一幅图像和一个掩码,然后在图像上的最大掩码对应区域的中心填充圆形。

    :param img: 输入的彩色图像,数据类型为NumPy数组。
    :param mask: 输入的掩码图像,是一个二值图像,数据类型为NumPy数组。
    :return: 经过处理后返回带有填充圆形的图像。
    """
    # 确保掩码是二值图像,且为单通道8位图像
    if len(mask.shape) != 2 or mask.dtype != np.uint8:
        raise ValueError("Mask must be a single-channel 8-bit image.")

    # 在掩码图像中寻找轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 寻找最大轮廓
    if contours:
        largest_contour = max(contours, key=cv2.contourArea)

        # 计算最大轮廓的几何中心
        M = cv2.moments(largest_contour)
        if M['m00'] != 0:
            cx = int(M['m10']/M['m00'])
            cy = int(M['m01']/M['m00'])
        else:
            # 如果轮廓面积为零(避免除以零),取轮廓的第一个点
            cx, cy = largest_contour[0][0]

        # 计算最大轮廓的外接矩形,用于确定圆的半径
        _, _, w, h = cv2.boundingRect(largest_contour)
        radius = min(w, h) // 3

        # 在原始图像上填充圆形,圆心为最大轮廓的几何中心,颜色为白色(255, 255, 255),填充实心圆
        cv2.circle(img, (cx, cy), radius, (255, 255, 255), -1)

    # 返回处理后的图像
    return img


def draw_circle(img,x,y,r):
    cv2.circle(img, (x,y), r, (0, 0, 255), 1)
    return img


def pair_gen(rgb_path, mask_path):
    """
    生成图像对
    :param rgb_path: RGB图像路径
    :param mask_path: 掩码图像路径
    :return: RGB图像,掩码图像
    """
    rgb = cv2.imread(rgb_path)
    mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
    return rgb, mask


if __name__ == '__main__':
    rgb_dir =r'E:\pose\datasets\obj_ac\obj_000000\rgb'
    mask_dir =r'E:\pose\datasets\obj_ac\obj_000000\mask'
    rgb_save_dir = r'E:\pose\datasets\obj_ac\obj_000000\rgb_gaussian'

    if not os.path.exists(rgb_save_dir):
        os.makedirs(rgb_save_dir)
    
    length = len(os.listdir(rgb_dir))
    for i in tqdm(range(length)):
        rgb_path = os.path.join(rgb_dir, f'{str(i)}.jpg')
        mask_path = os.path.join(mask_dir, f'{str(i)}.jpg')
        rgb_save_path = os.path.join(rgb_save_dir, f'{str(i)}.jpg')
        rgb, mask = pair_gen(rgb_path, mask_path)
        rgb = mask_white(rgb, mask)
        cv2.imwrite(rgb_save_path, rgb)
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值