生成随机mask以及根据mask对两幅图片进行合并

2023-10-26

前言

对图像处理的一些操作还是需要掌握的嘿嘿



随机mask生成

这里代码参考MAT的一份代码: https://github.com/fenglinglwb/MAT/blob/main/datasets/mask_generator_256.py

import numpy as np
from PIL import Image, ImageDraw
import math
import random
import os


def RandomBrush(
    max_tries,
    s,
    min_num_vertex = 4,
    max_num_vertex = 18,
    mean_angle = 2*math.pi / 5,
    angle_range = 2*math.pi / 15,
    min_width = 12,
    max_width = 48):
    H, W = s, s
    average_radius = math.sqrt(H*H+W*W) / 8
    mask = Image.new('L', (W, H), 0)
    for _ in range(np.random.randint(max_tries)):
        num_vertex = np.random.randint(min_num_vertex, max_num_vertex)
        angle_min = mean_angle - np.random.uniform(0, angle_range)
        angle_max = mean_angle + np.random.uniform(0, angle_range)
        angles = []
        vertex = []
        for i in range(num_vertex):
            if i % 2 == 0:
                angles.append(2*math.pi - np.random.uniform(angle_min, angle_max))
            else:
                angles.append(np.random.uniform(angle_min, angle_max))

        h, w = mask.size
        vertex.append((int(np.random.randint(0, w)), int(np.random.randint(0, h))))
        for i in range(num_vertex):
            r = np.clip(
                np.random.normal(loc=average_radius, scale=average_radius//2),
                0, 2*average_radius)
            new_x = np.clip(vertex[-1][0] + r * math.cos(angles[i]), 0, w)
            new_y = np.clip(vertex[-1][1] + r * math.sin(angles[i]), 0, h)
            vertex.append((int(new_x), int(new_y)))

        draw = ImageDraw.Draw(mask)
        width = int(np.random.uniform(min_width, max_width))
        draw.line(vertex, fill=1, width=width)
        for v in vertex:
            draw.ellipse((v[0] - width//2,
                          v[1] - width//2,
                          v[0] + width//2,
                          v[1] + width//2),
                         fill=1)
        if np.random.random() > 0.5:
            mask.transpose(Image.FLIP_LEFT_RIGHT)
        if np.random.random() > 0.5:
            mask.transpose(Image.FLIP_TOP_BOTTOM)
    mask = np.asarray(mask, np.uint8)
    if np.random.random() > 0.5:
        mask = np.flip(mask, 0)
    if np.random.random() > 0.5:
        mask = np.flip(mask, 1)
    return mask


def RandomMask(s, hole_range=[0,1]):
    coef = min(hole_range[0] + hole_range[1], 1.0)
    while True:
        mask = np.ones((s, s), np.uint8)
        def Fill(max_size):
            w, h = np.random.randint(max_size), np.random.randint(max_size)
            ww, hh = w // 2, h // 2
            x, y = np.random.randint(-ww, s - w + ww), np.random.randint(-hh, s - h + hh)
            mask[max(y, 0): min(y + h, s), max(x, 0): min(x + w, s)] = 0
        def MultiFill(max_tries, max_size):
            for _ in range(np.random.randint(max_tries)):
                Fill(max_size)
        MultiFill(int(4 * coef), s // 2)
        MultiFill(int(2 * coef), s)
        mask = np.logical_and(mask, 1 - RandomBrush(int(8 * coef), s))  # hole denoted as 0, reserved as 1
        hole_ratio = 1 - np.mean(mask)
        if hole_range is not None and (hole_ratio <= hole_range[0] or hole_ratio >= hole_range[1]):
            continue
        return mask[np.newaxis, ...].astype(np.float32)



封装一下生成mask函数

def dir_not_exists_then_create(dir_name):
    if not os.path.exists(dir_name):
        os.makedirs(dir_name)


def generate_mask(output_mask_path, resolution=256, hole_range=[0.2, 0.4]):
    dir_name = '/'.join(output_mask_path.split('/')[:-1])
    # print(dir_name)
    dir_not_exists_then_create(dir_name)
    
    # mask = RandomBrush(s=256, max_tries=5)
    mask = RandomMask(s=resolution, hole_range=hole_range)
    mask = mask * 255
    # print(mask)
    mask = mask.repeat(3, axis=0)
    mask = mask.transpose(1, 2, 0)
    print(mask.shape)
    img = Image.fromarray(np.uint8(mask))
    img.save(output_mask_path)

调用一下

generate_mask(output_mask_path='mask/mask_{}.png'.format(1), hole_range=[0.1, 0.4])



两张图片合成

这里以celeba-256为例子

def two_image_join_by_mask(img1_path, img2_path, mask_path, output_image_path):
    dir_name = '/'.join(output_image_path.split('/')[:-1])
    # print(dir_name)
    dir_not_exists_then_create(dir_name)

    img1 = np.array(Image.open(img1_path))
    img2 = np.array(Image.open(img2_path))
    mask = np.array(Image.open(mask_path))
    mask = mask / 255.0

    img1[:, :, :] = img1[:, :, :] * mask
    img2[:, :, :] = img2[:, :, :] * (1 - mask)
    img1 = img1 + img2
    img1 = Image.fromarray(np.uint8(img1))
    img1.save(output_image_path)



调用一下

img1_path = 'pic/000255.jpg'
img2_path = 'pic/001133.jpg'
mask_path = 'mask/mask_1.png'
output_image_path = 'pic/000255_001133.jpg'
two_image_join_by_mask(img1_path, img2_path, mask_path, output_image_path)

000255.jpg

001133.jpg

000255_001133.jpg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成随机mask以及根据mask对两幅图片进行合并 的相关文章

  • winpdb 不适用于 python 3.3

    我无法让 rpdb2 与 python 3 3 一起运行 但根据多个来源 这应该是可能的 rpdb2 d myscript py A password should be set to secure debugger client serv
  • SQLAlchemy 闭包表关系定义

    我最近开始使用 SQL Alchemy 开展一个涉及攀岩区域和路线的项目 区域是分层的 因为单个区域可以包含多个区域 而多个区域又可以包含其他区域 路线直接与单个区域关联 但也与该区域的父区域关联 等等 为了实现这一点 我选择使用Bill
  • Django:如何从管理界面调用管理自定义命令执行?

    参考 从代码执行管理命令 https stackoverflow com questions 907506 how can i call a custom django manage py command directly from a t
  • 使用数据库数据模型生成 SQLAlchemy 模型、架构和 JSON 响应

    将 Flask 和 SQLAlchemy 用于 Python Web 应用程序 我的目标是创建一个系统 在其中我可以 从现有 PostgreSQL 数据库导入数据模型 并将它们映射到相应 SQLAlchemy 模型中的字段 使用这些 SQL
  • 如何从numpy数组中获取两个最小值

    我想从数组中取出两个最小值x 但是当我使用np where A B np where x x min 0 1 我收到此错误 ValueError 需要超过 1 个值才能解压 我该如何修复这个错误 我需要在数组中按升序排列数字吗 您可以使用n
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • Python 有哪些 SOAP 客户端库,它们的文档在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 向 list.extend() 传递不可迭代对象

    我正在创建一个公共方法来允许调用者将值写入设备 例如将其称为 write vals 由于这些值将实时输入 因此我希望通过允许用户输入列表或单个值来简化用户的生活 具体取决于他们需要写入的值的数量 例如 write to device 1 2
  • Python 2to3 Windows CMD

    我已经安装了 python 32 包到 C python32 我还设置了路径 Python 路径 C Python32 Lib C Python32 DLLs C Python32 Lib lib tk 路径 C Python32 我想使用
  • 在pycharm中使用多处理时如何调试

    我正在 pycharm 社区版中使用 anaconda2 调试多进程程序 它有几个后台工作进程 工作进程将检查输入队列以检索任务 而不会休眠 直到收到任务 事实上 我只对主要流程感兴趣 但是pycharm调试器总是单步进入子进程 看起来主进
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • PySide2/QML 填充 Gridview 模型/委托并为其设置动画

    我是 QML 的新手 正在寻求以下几点帮助 如何基于 TextField 输入 如 Regex 通过 PySide2 过滤 Gridview 模型中的 QAbstractListModel 数据 标题 如何在鼠标悬停时为 Gridview
  • 将 csv 写入谷歌云存储

    我试图了解如何将多行 csv 文件写入谷歌云存储 我只是没有遵循文档 https googlecloudplatform github io google cloud python stable storage blobs html hig
  • 单个函数的 Numpy 均值和方差?

    使用 Numpy Python 是否可以从单个函数调用返回均值 AND 方差 我知道我可以单独做它们 但是计算样本标准差需要平均值 因此 如果我使用单独的函数来获取均值和方差 则会增加不必要的开销 我尝试在这里查看 numpy 文档 htt
  • 返回 OSError 异常类的子类实例的逻辑在哪里?

    我一直在寻找一些对某些人来说可能相对愚蠢的东西 但对我来说非常有趣 输入和输出错误已合并为OSError在 Python 3 3 中 异常类层次结构发生了变化 关于内置类的一个有趣的特性OSError是这样 它在传递时返回它的子类errno
  • 第 100 次避免循环导入

    Summary 我继续有一个ImportError在一个复杂的项目中 我已经将其蒸馏到仍然会出现错误的最低限度 Example 巫师有装有绿色和棕色药水的容器 这些可以添加在一起 产生同样是绿色或棕色的新药水 我们有一个PotionABC
  • 捕获 CommandOnCooldown 错误

    我正在制作一个有冷却时间的不和谐机器人 并且我正在尝试制作一个事件 当CommandOnCooldown发生错误时 机器人会通过私信告诉他们需要等待多长时间 这是我的代码 看起来一切正常 但它不知道 retry after 意味着什么 bo
  • 如何从已安装的云端硬盘文件夹中永久删除?

    我编写了一个脚本 在每次迭代后将我的模型和训练示例上传到 Google Drive 以防发生崩溃或任何阻止笔记本运行的情况 如下所示 drive path drive My Drive Colab Notebooks models if p
  • 从 C++ 检索 Python 类型

    这个问题实际上是以下两个问题的延伸 如何在 Python 中实现 C 类 以供 C 调用 https stackoverflow com questions 9040669 how can i implement a c class in
  • 设置restrict_xpaths设置后出现UnicodeEncodeError

    我是 python 和 scrapy 的新手 将restrict xpaths 设置设置为 table class lista 后 我收到了以下回溯 奇怪的是 通过使用其他 xpath 规则 爬虫可以正常工作 Traceback most

随机推荐

  • FFmpeg录制流

    FFmpeg下windows安装 下载地址 http ffmpeg org download html windows 下载 ffmpeg release essentials zip 这个文件名 解压后将bin目录加到环境变量path 录
  • 内存使用(分段、分区、分页、多级页表、快表)--OS

    内存使用 内存使用 将程序放在内存中 PC指向内存地址 首先 我们需要让程序进入内存 举个例子 int main int argc char argv text entry 入口地址 call main call exit main ret
  • windows默认文件(桌面、下载、文档等)设置为C盘根路径后怎么修改回去

    桌面 下载 文档等设置为C盘根路径后怎么修改回去 1 问题 2 解决办法 2 1 按 Win R 调出运行窗口 输入 regedit 并按回车 2 2 在弹出的注册表窗口里 打开下面路径 计算机 HKEY CURRENT USER SOFT
  • 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法 是从一个顶点到其余各顶点的最短路径算法 解决的是有权图中最短路径问题 迪杰斯特拉算法主要特点是从起始点开始 采用贪心算法的策略 每次遍历到始点距离最近且未访问过的顶点的邻接节点 直到扩展到终点为止 以下是数
  • 【Golang】切片(slice)

    文章目录 切片 直接声明新的切片 append 函数为切片添加元素 复制切到另一个切片 从切片中删除元素 从开头位置删除 从中间位置删除 从尾部删除 切片 切片 slice 是对数组的一个连续片段的引用 所以切片是一个引用类型 这个片段可以
  • scss 转为 less

    tnpm install less plugin sass2less g sass2less scss dir name less rm rf scss 转载于 https www cnblogs com lyraLee p 1048966
  • virtualbox的虚拟机联不通外网的问题

    问题描述 在网卡配置上按照网上的操作配置好了 但是仍然联不通外网 ip地址显示为127 0 0 1 解决 通过输入dhclient v命令解决
  • Spring框架常用注解及通配符总结

    Autowired 自动注入 默认是类型匹配 使用配置文件需要set 使用注解不需要 只需要类属性 Autowired可以和 Qualifier beanName 配合着使用 Qualifier beanName 多个相同类型的bean 标
  • 基于深度学习的目标检测方法综述

    引言 现有的深度学习的目标检测方法 可以大致分为两类 一 基于候选区域的目标检测方法 二 基于回归的目标检测方法 依据方法的提出时间 可以构建出如下时间线 2014 CVPR R CNN 1 2015 arXiv DenseBox 14 2
  • 「开源项目」现代化开源Linux服务器运维管理面板-1Panel

    1Panel 基本介绍 1Panel 是新一代的 Linux 服务器运维管理面板 产品优势 快速建站 深度集成 Wordpress 和 Halo 域名绑定 SSL 证书配置等一键搞定 高效管理 通过 Web 端轻松管理 Linux 服务器
  • arm汇编中感叹号/叹号的作用

    arm汇编中存在一个神奇的可选后缀 一般是在寄存器或寻址方式之后 对于加了叹号的情况 访问内存时先根据寻址方式更改寄存器的值 再按照该已经更新的值访问内存
  • 基于深度学习的目标检测算法概述

    摘要 目标检测是计算机视觉的一个重要分支 其目的是准确判断图像或视频中的物体类别并定位 传统的目标检测方法包括这三个步骤 区域选择 提取特征和分类回归 这样的检测方法存在很多问题 现已难以满足检测对性能和速度的要求 基于深度学习的目标检测方
  • 电子元器件/模块供应商汇总

    晶振 WIFI MLCC电容
  • Python制作模拟按键摘录,pyautogui库及该库在某些窗口不生效的问题部分解决措施(PyDirectInput库、winio驱动级模拟)

    文章目录 toc 一 使用pyautogui库 1 安装pyautogui库 2 导入并在py中使用 1 导包 2 基本鼠标控制 3 基本键盘控制 4 屏幕截图 5 图片位置识别 3 存在问题 二 使用PyDirectInput库解决某些游
  • 机器学习——数据清洗,特征选择

    数据清洗的方法 设置阈值去掉异常值 随机森林预测去掉点的数值加进去 onehot编码 不适用于决策树和随机森林 先将一个属性分成几个类别 然后再将样本的数据变成矩阵01 1表示其所在类别 会导致特征数增多 数据清洗代码实现 import n
  • Linux磁盘扩容详解

    公司项目服务器是买的阿里的 原来的项目是外包出去别人做的 用户图片上传保存到了服务器上 500G的磁盘空间硬生生给用完了 怎么搞 扩容呗 大概思路就是从阿里那再买一块磁盘 添加到ESC实例上 然后挂载 然后格式化磁盘文件 然后把老图片mv过
  • STL sort排序算法详细介绍

    用于C 中 对给定区间所有元素进行排序 头文件是 include
  • selenium中键盘操作:Keys类

    一 前言 selenium提供了比较完整的键盘操作 在使用的模拟键盘操作之前需要我们导入Keys类 from selenium webdriver common keys import Keys 二 常用的非组合键操作 1 回车键 Keys
  • python循环综合运用

    循环很重要 计算机很蠢 唯一的优势就是按照指令不停的执行 所以决定在说一下 break语句 用在循环体中 迫使循环立即终止 即跳出所在循环体 继续执行循环体后面的语句 sum 0 i 1 while i sum i i 1 if i gt
  • 生成随机mask以及根据mask对两幅图片进行合并

    前言 对图像处理的一些操作还是需要掌握的嘿嘿 随机mask生成 这里代码参考MAT的一份代码 https github com fenglinglwb MAT blob main datasets mask generator 256 py