常见的图像融合方法

news2024/11/16 5:43:09

这里我们将介绍一些常用的图像融合方式,并不涉及到诸如CutMix、MixUp、TokenMix、Mosaic、Copy-Paste等图像增强方法。

首先是读取图像,我们这边采用了PIL库进行,那么读进来就应该是一个Image对象。下面介绍Image对象与array的转换方式。

from PIL import Image 
import numpy as np

img=Image.open(path)

# 从Image读取数据
img=np.array(img,dtype=np.float32)

# 从array转为Image
img=Image.fromarray(img)

有了前置知识后,我们就可以来进行图像融合了。注意,接下来的方法适用于图像大小相等的情况,如果不相等可以重设图像的尺寸。

import numpy as np
import random
from PIL import Image

def combine_images(original_img, augmented_img,combine_choice=None, blend_width=20):
    width, height = 640, 640
    combine_choice = random.choice(['horizontal', 'vertical',]) if combine_choice==None else combine_choice

    if combine_choice == 'randomMix':
        o,a=np.array(original_img),np.array(augmented_img)
        data = [i for i in range(640 * 640)]
        idx = random.sample(data, int(640 * 640 * 0.5))
        for k in idx:
            i, j = k // 640, k % 640
            o[i][j] = a[i][j]
        return Image.fromarray(o)

    elif combine_choice == 'vertical':  # Vertical combination
        mask = np.linspace(0, 1, blend_width).reshape(-1, 1)
        mask = np.tile(mask, (1, width))  # Extend mask horizontally
        mask = np.vstack([np.zeros((height // 2 - blend_width // 2, width)), mask,
                          np.ones((height // 2 - blend_width // 2 + blend_width % 2, width))])
        mask = np.tile(mask[:, :, np.newaxis], (1, 1, 3))

    elif combine_choice == 'horizontal':
        mask = np.linspace(0, 1, blend_width).reshape(1, -1)
        mask = np.tile(mask, (height, 1))  # Extend mask vertically
        mask = np.hstack([np.zeros((height, width // 2 - blend_width // 2)), mask,
                          np.ones((height, width // 2 - blend_width // 2 + blend_width % 2))])
        mask = np.tile(mask[:, :, np.newaxis], (1, 1, 3))
    elif combine_choice == 'diag1':
        mask = np.ones((width, height))
        mask[:width // 2, :height // 2] = 0
        mask[width // 2:, height // 2:] = 0
        mask = np.tile(mask[:, :, np.newaxis], (1, 1, 3))
    else:
        mask = np.zeros((width, height))
        mask[:width // 2, :height // 2] = 1
        mask[width // 2:, height // 2:] = 1
        mask = np.tile(mask[:, :, np.newaxis], (1, 1, 3))

    original_array = np.array(original_img, dtype=np.float32) / 255.0
    augmented_array = np.array(augmented_img, dtype=np.float32) / 255.0

    blended_array = (1 - mask) * original_array + mask * augmented_array
    blended_array = np.clip(blended_array * 255, 0, 255).astype(np.uint8)

    return  Image.fromarray(blended_array)

RandomMix将从图像A中随机选择像素点,并由B图像的像素点替代。

HorizontalVerticalDiag则是会创造一个水平、垂直、对角线掩膜,用于遮盖A图的部分,并有B图替代。

下面看使用案例。

import matplotlib.pyplot as plt

combines=['randomMix', 'vertical','horizontal', 'diag1', 'diag2']
def draw(img,idx,title):
    plt.subplot(int("15"+str(idx)))
    plt.imshow(img)
    plt.title(title)
    plt.xticks([])
    plt.yticks([])
p=r"C:\Users\Administrator\Downloads\result1.5\result\original_resized\class0"
img1,img2=Image.open(p+"//0.jpg"),Image.open(p+"//1.jpg")
res=combine_images(img1,img2)

plt.figure(figsize=(20,6))
for i,j in enumerate(combines):
    draw(combine_images(img1,img2,j),i+1,j)
plt.show()

我们选择两张不同的图像A,B,进行操作后的结果如下图所示:

在这里插入图片描述


ISH变换

将高分辨率图像的I分量替换低分辨率的图像,在保留结构纹理的同时获取色彩信息。

def IHS(data_low, data_high, alpha=0.7):  
    Trans = np.matrix([  
        [1. / 3., 1. / 3., 1. / 3.],  
        [-2 ** 0.5 / 6, -2 ** 0.5 / 6, 2 * 2 ** 0.5 / 6],  
        [1 / 2 ** 0.5, -1 / 2 ** 0.5, 0]  
    ])  
  
    Itrans = np.matrix([  
        [1, -1 / 2 ** 0.5, 1 / 2 ** 0.5],  
        [1, -1 / 2 ** 0.5, -1 / 2 ** 0.5],  
        [1, 2 ** 0.5, 0]  
    ])  
  
    data_high = data_high.transpose()  
    data_low = data_low.transpose()  
  
    data_high = data_high.reshape(3, 640 * 640)  
    data_low = data_low.reshape(3, 640 * 640)  
  
    AIHS = np.dot(Trans, np.matrix(data_high))  
    BIHS = np.dot(Trans, np.matrix(data_low))  
  
  
    BIHS[0, :] = BIHS[0, :] * (1 - alpha) + AIHS[0, :] * (alpha)  
  
    RGB = np.array(np.dot(Itrans, BIHS))  
    RGB = RGB.reshape((3, 640, 640))  
  
    return RGB.transpose()

注意,ISH变换需要较长的运行时间,而且在性能上可能提升不大。


元素乘法/加法

我们从Beta分布中选取随机数来进行元素乘法(加法):

def get_ab(beta):  
  if np.random.random() < 0.5:  
    a = np.float32(np.random.beta(beta, 1))  
    b = np.float32(np.random.beta(1, beta))  
  else:  
    a = 1 + np.float32(np.random.beta(1, beta))  
    b = -np.float32(np.random.beta(1, beta))  
  return a, b

# 如果传进来的是Image,需要转成array

def add(img1, img2, beta):  
  a, b = get_ab(beta)  
  img1, img2 = img1 * 2 - 1, img2 * 2 - 1  
  out = a * img1 + b * img2  
  out = (out + 1) / 2  
  return out

def multiply(img1, img2, beta):  
  a, b = get_ab(beta)  
  img1, img2 = img1 * 2, img2 * 2  
  out = (img1 ** a) * (img2.clip(1e-37) ** b)  
  out = out / 2  
  return out

叠置、前后幕等方法

def screen(img1, img2, beta):  
  img1, img2 = invert(img1), invert(img2)  
  out = multiply(img1, img2, beta)  
  return invert(out)  
  
def overlay(img1, img2, beta):  
  case1 = multiply(img1, img2, beta)  
  case2 = screen(img1, img2, beta)  
  if np.random.random() < 0.5:  
    cond = img1 < 0.5  
  else:  
    cond = img1 > 0.5  
  return np.where(cond, case1, case2)  
  
def darken_or_lighten(img1, img2):  
  if np.random.random() < 0.5:  
    cond = img1 < img2  
  else:  
    cond = img1 > img2  
  return np.where(cond, img1, img2)  
  
def swap_channel(img1, img2):  
  channel = np.random.randint(3)  
  img1[channel] = img2[channel]  
  return img1

图像直接相加

def imageAdd(base_img, overlay_img, alpha=0.20):  
  
    overlay_img_resized = overlay_img.resize(base_img.size)  
    base_array = np.array(base_img, dtype=np.float32)  
    overlay_array = np.array(overlay_img_resized, dtype=np.float32)  
  
    blended_array = (1 - alpha) * base_array + alpha * overlay_array  
    blended_array = np.clip(blended_array, 0, 255).astype(np.uint8)  
    blended_img = Image.fromarray(blended_array)  
    return blended_img  
  
def ImageListAdd(imglist, weight=None):  
  
    n=[1/len(imglist)]*len(imglist) if not weight else weight  
    base_array=np.array(imglist[0],dtype=np.float32)*n[0]  
    for idx,i in enumerate(imglist[1:]):  
        i=np.array(i,dtype=np.float32)  
        base_array+=n[idx+1]*i  
    blended_array = np.clip(base_array, 0, 255).astype(np.uint8)  
    blended_img = Image.fromarray(blended_array)  
    return blended_img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984228.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&#xff0c;实现对未来土…

AI9-文本识别

本章主要介绍文本识别算法的理论知识,包括背景介绍、算法分类和部分经典论文思路。 通过本章的学习,你可以掌握: 1. 文本识别的目标 2. 文本识别算法的分类 3. 各类算法的典型思想 1 背景介绍 文本识别是OCR(Optical Character Recognition)的一个子任务,其任务为识别一个…

pytorch的入门使用

pytorch安装略&#xff01; 一.张量Tensor 张量是一个统称其中包含0阶&#xff0c;1阶&#xff0c;2阶&#xff0c;3阶&#xff0c;4阶&#xff0c;.......n阶。 0阶&#xff1a;标量&#xff0c;常数&#xff0c;0-D Tensor 1阶&#xff1a;向量&#xff0c;1-D Tensor 2…

使用java反编译工具jad

文章目录 反编译工具 JAD下载配置环境变量使用其他反编译工具 JD-GUI 反编译工具 JAD 反编译是指将编译后的字节码文件&#xff08;.class 文件&#xff09;转换回可读的 Java 源代码。JAD (Java Decompiler) 是一个经典的反编译工具&#xff0c;广泛用于将 Java 字节码反编译…

国内AI大模型168个,哪个最有前途?

168个国产大模型&#xff0c;都是什么来头&#xff1f; 1785年&#xff0c;瓦特改进了蒸汽机&#xff0c;人类从此摆脱了手工业的桎梏&#xff0c;迈向辉煌的蒸汽时代。 1870年&#xff0c;第二次工业革命光芒四溢&#xff0c;人类踏上了电气时代的漫长征程。 20世纪70年代后…

手机有两个卡槽分别放什么卡,这篇文章建议收藏!

你发现了吗&#xff0c;我们现在对于手机卡的需求是越来越大了&#xff0c;相信大多数用户手上都不止一张SIM卡&#xff0c;大部分都是双卡&#xff0c;甚至三卡了&#xff0c;那么&#xff0c;这些卡槽你真的利用对了吗&#xff1f; 这篇文章就告诉大家&#xff0c;如何更好的…

【Windows】Beyond Compare 5(文件数据对比神器) 软件介绍

今天给大家介绍的软件叫Beyond Compare&#xff0c;这是一个文件数据对比神器&#xff0c;可以让你从茫茫数据、文字中解放出来。 Beyond Compare 是一款功能强大的文件和文件夹比较工具&#xff0c;主要用于比较和同步文件、文件夹及其内容。以下是该软件的主要特点和功能&…

一款免费开源的在线白板,手绘风格在线画图神器

Excalidraw 是一款开源的虚拟手绘风格在线白板工具&#xff0c;它专注于提供简单、直观且功能丰富的绘图体验。这款工具特别适合用于创建图表、线框图、思维导图、流程图以及其他各种类型的图形和视觉内容。 Excalidraw 的主要特点包括&#xff1a; 免费开源&#xff1a;Exca…

如何正确地实现虚拟类?

在 Python 中&#xff0c;所谓的虚拟类通常是指抽象基类&#xff08;Abstract Base Class&#xff0c;简称 ABC&#xff09;。抽象基类不可实例化&#xff0c;其主要作用是定义一组抽象方法&#xff0c;子类必须实现这些抽象方法才能被实例化。 要正确实现虚拟类&#xff08;抽…

新时代来临,跟60后、70后的奢侈消费观念说拜拜吧!

在长达几十年的改革开放壮丽征程中&#xff0c;60后与70后的消费观念深刻塑造了家庭经济的面貌&#xff0c;他们倾尽所有为子女铺设未来之路&#xff0c;从婚房婚车到教育投资&#xff0c;无一不体现了深沉的父爱母爱。然而&#xff0c;随着时代的变迁&#xff0c;尤其是当中国…

连接数据库报错bad handshake

堡垒机账号没有授权访问权限

【xml文档的读取与导入】

首先基于unity引擎&#xff0c;关于xml文档的导入只需要Excel与笔记本两种 打开记事本编写xml代码如下 <?xml version"1.0" encoding"UTF-8"?> <root> <item ID""> <surname></surname> &…

2024开学季必备物品有哪些?新学期学生必备必备物品清单

临近开学&#xff0c;萌新们是否已经开始准备学习物品了呢&#xff1f;正在准备的你&#xff0c;头脑里一定有满满的问号感到头大&#xff0c;不用担心&#xff01;学长学姐们为你准备了详细的开学物品清单&#xff0c;到处搜攻略不如直接看此篇清单&#xff01;快来一起看看吧…

Eclipse 2024 下载 安装 汉化

1&#xff0c;解压 Eclipse 2024 压缩包到当前目录下&#xff1a; 点击此处蓝色字体下载压缩包 提取码 j5nl 2&#xff0c;鼠标右键 点击 jdk-19_windows-x64_bin.exe 选择 以管理员身份运行 &#xff1a; 3&#xff0c;点击 下一步&#xff1a; 4&#xff0c;点击 更改 选择位…

fscan安装

windows安装 1.go语言下载。 下载msi版本&#xff0c;直接安装就可以不用配置环境变量&#xff0c;默认是帮你安装配合好的 All releases - The Go Programming Language 2.配置go环境 使用默认配置的话&#xff0c;下载速度过慢&#xff0c;导致无法完成编译。故需要配置代理…

sql注入——sqlilabs1-15

目录 sql注入靶场练习--sqlilabs 1.less-1​编辑 1.测试发现单引号为逃逸符号 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.查询用户表的列名字 6.查询用户信息 2.less-2​编辑 2.确定查询列数为三列 3.查询到数据库名 4.查询数据库中的表名 5.…

html实现好看的塔罗牌、十二星座运势网站源码

文章目录 1.设计来源1.1 十二星座1.2 所有界面效果图 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

几种显微镜的作用(光片,多光子)

若进行细胞的成像&#xff0c;我们通常使用宽场或者共聚焦显微镜&#xff1b;若想要对长时间发育的类器官进行快速成像&#xff0c;则活细胞成像仪是首选&#xff1b;若涉及小鼠整个器官的成像&#xff0c;则会选用双光子显微镜。由此可见&#xff0c;针对不同尺度的样品成像需…

<数据集>灭火器识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3262张 标注数量(xml文件个数)&#xff1a;3262 标注数量(txt文件个数)&#xff1a;3262 标注类别数&#xff1a;1 标注类别名称&#xff1a;[extinguisher] 使用标注工具&#xff1a;labelImg 标注规则&#xf…

材料学子终于迎来了春天,这3本SCI退稿率<20%,2个录用!

导师逼发顶刊&#xff0c;毕不了业&#xff1f;怎么办? 想拿奖学金&#xff0c;还差一篇SCI&#xff1f; 心仪工作对SCI论文有要求&#xff0c;自己没有? 别慌~准确找到一个命中率高&#xff0c;审稿周期短的期刊真的是省心又省力。 今天&#xff0c;老毕给大家分享3本材料科…