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

这篇具有很好参考价值的文章主要介绍了生成随机mask以及根据mask对两幅图片进行合并。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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



随机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])
生成随机mask以及根据mask对两幅图片进行合并,python,numpy,图像处理,mask



两张图片合成

这里以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

生成随机mask以及根据mask对两幅图片进行合并,python,numpy,图像处理,mask

001133.jpg
生成随机mask以及根据mask对两幅图片进行合并,python,numpy,图像处理,mask

000255_001133.jpg
生成随机mask以及根据mask对两幅图片进行合并,python,numpy,图像处理,mask文章来源地址https://www.toymoban.com/news/detail-626996.html

到了这里,关于生成随机mask以及根据mask对两幅图片进行合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Midjourney】Midjourney根据prompt提示词生成黑白色图片

    目录 🍇🍇Midjourney是什么? 🍉🍉Midjourney怎么用? 🔔🔔提示词格式 🍋🍋应用示例——“秘密花园”式涂色书配图生成  🍌🍌例子1-生成黑白马  prompt prompt翻译 生成效果 大图展示  💖💖例子2-生成鸦 prompt prompt翻译 生成效果  大图展示  🙋🙋例子3-生成鹰 prompt promp

    2024年02月03日
    浏览(75)
  • 你们有试过根据文字生成图片的AI绘画软件吗?

    在现如今的信息爆炸时代,我们不仅需要文字表达,还需要图像元素的加入来使得我们的内容更加生动、有趣和易于传播。但是,作为普通人,我们并不一定具备专业的图形设计技能。因此,许多软件开发商推出了根据输入文字生成图片的软件,通过将文字转化为图片,为我

    2024年02月09日
    浏览(52)
  • 代码片记录-使用DDC对两路信号相位差进行求取(matlab实现)

    参考链接: 1、FPGA综合系统设计(七)基于DDC的两路信号相位差检测_fpga相位测量-CSDN博客 (真的太牛了) 2、双通道中频信号数字下变频及相位差估计(FPGA)_根据 i、q 两路信号以如何求出中频信号的频率和相位差-CSDN博客 (通过这个篇博客注意到了反正切的值域问题,里面

    2024年04月14日
    浏览(37)
  • MySQL根据出生日期查询年龄,以及对年龄进行分组统计

    表stu数据如下 1. 根据出生日期查询年龄 返回结果: 函数DATE():提取日期或日期/时间表达式的日期部分; 函数CURDATE():返回当前的日期; 函数TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2):计算两个日期的时间差,unit是计算时间差的单位,可以是SECOND秒、MINUTE分钟、HOUR小时、DAY天

    2024年02月11日
    浏览(62)
  • 根据图片生成前端代码:GPT vesion 助你释放效能 | 开源日报 No.98

    Stars: 36.4k License: NOASSERTION PHP 是一种流行的通用脚本语言,特别适合 Web 开发。快速、灵活和实用,PHP 支持从博客到世界上最受欢迎的网站等各种应用。PHP 遵循 PHP 许可证 v3.01 发布。 主要功能: 提供强大而灵活的脚本语言支持 适合 Web 开发 快速、灵活、实用 强大而全面的扩

    2024年01月24日
    浏览(42)
  • 【python脚本】python实现:目标检测裁剪图片样本,根据类标签文件进行裁剪保存

    我在进行目标检测时候,比如红绿灯检测,目标区域很小,样本杂乱。 想要筛选错误样本的话,很困难。可以把目标区域裁剪出来。人大脑处理对于这样的异己比较敏感。样本量较少的话可以自己筛一筛。样本量较大的话,可以训练一个分类模型帮你筛一下。 它就可以实现

    2024年02月15日
    浏览(41)
  • Taro+vue微信小程序根据字符串生成二维码图片,点击弹出图片,长按保存(可用!!!)

    效果:页面加载时生成二维码,点击二维码弹出图片,长按图片可保存。 借鉴了一个大佬的文章https://www.zhangshengrong.com/p/q0arZ9J4ax/#google_vignette

    2024年02月10日
    浏览(58)
  • 【Java】itext 实现 html根据模板生成pdf 中文不显示/图片不显示问题解决

    工作中需要使用生成pdf记录,选取使用的是itext 生成 pdf方式。分享下实现方式及遇到的问题。 这里随便找个html课程表作为示例,添加了几张图片为了展示图片转pdf功能。 一:引入jar包 二:导入ftl文件 这块使用的是html语法,将文件后缀名改为ftl即可,在需要参数的地方通过

    2024年02月05日
    浏览(43)
  • pandas中根据两列 或 多列进行条件对比,生成新列【三种方法】

    两列数量对比,收货比期望多,就是标记数量满足,否则就数量不满足 如果数量满足、日期满足,那么总体就标记满足,有一个不满足就总体标记不满足

    2024年02月14日
    浏览(42)
  • java 使用POI-TL根据word模版,生成word文件,含图片,富文本。

    1.引入mavna坐标` 2 .poi-tl-ext插件主要用于富文本内容格式在word展现 3.word模版创建 3.具体代码实现 4.本文的miniourl路径实质为网络路径的文件。

    2024年02月16日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包