图片合成融合

简介: 【6月更文挑战第21天】

def direct_merge(img_tags, bg_image, location):
    '''
    功能:将图像-img_tags 融合到图像-bg_image 指定位置-location
    参数:
        img_tags : ndarray
            图像数组:前景贴纸图像
        bg_image : ndarray
            图像数组:背景图像
        location : list-二位列表:元组的列表
            存储位置的坐标,比如[(226, 365), (230, 405)]
    返回值:融合后的图像
    '''
    posx = location[0]
    posy = location[1]

    img_tags_c = img_tags.copy()
    bg_img_c = bg_image.copy()

    height, width, channels = img_tags_c.shape
    height_bg, width_bg, channels_bg = bg_img_c.shape

    LeftUpLocation = [int(posy - height // 2), int(posx - width // 2)]

    if channels == 4:
        B, G, R, img_alpha = cv2.split(img_tags_c)
        for i in range(height):  # 第i行,图像垂直方向
            for j in range(width):  # 第j列,图像水平方向
                if img_alpha[i, j] == 255 and 0 < LeftUpLocation[0] + i < height_bg and 0 < LeftUpLocation[
                    1] + j < width_bg:
                    bg_img_c[LeftUpLocation[0] + i, LeftUpLocation[1] + j] = img_tags_c[i, j][:3]
    else:
        for i in range(height):
            for j in range(width):
                if img_alpha[i, j] == 255 and 0 < LeftUpLocation[0] + i < height_bg and 0 < LeftUpLocation[
                    1] + j < width_bg:
                    bg_img_c[LeftUpLocation[0] + i, LeftUpLocation[1] + j] = img_tags_c[i, j]

    return bg_img_c

函数参数解释:

  • img_tags: 前景图像的数组表示,可能是一个灰度图像(单通道)或彩色图像(三通道或四通道,如果包含透明度)。
  • bg_image: 背景图像的数组表示,通常是一个三通道的彩色图像。
  • location: 一个包含两个元组的列表,指定了前景图像左上角在背景图像中的位置。
    image.png

函数实现步骤:

  1. 复制图像数据:使用 .copy() 方法复制前景和背景图像的数据,避免在原始图像上直接修改。

  2. 获取图像尺寸:获取前景和背景图像的高度和宽度以及通道数。

  3. 计算左上角位置LeftUpLocation 计算前景图像左上角在背景图像中的实际坐标。这是通过从指定位置减去前景图像尺寸的一半得到的。

  4. 处理透明度:如果前景图像是四通道的(即包含透明度通道),则使用 cv2.split 分离出透明度通道 img_alpha。对于每个像素,如果透明度为 255(完全不透明),则执行融合操作。

  5. 融合图像:遍历前景图像的每个像素,如果该像素的透明度为 255(对于四通道图像),并且其在背景图像中的坐标有效(即在背景图像的边界内),则将前景图像的像素值复制到背景图像的相应位置。

  6. 返回结果:返回修改后的背景图像,其中已经融合了前景图像。

原理解释:

  • 图像融合:图像融合通常涉及将两个或多个图像合并为一个图像。在这个函数中,是将前景图像融合到背景图像上。
  • 坐标计算:通过计算前景图像左上角在背景图像中的位置,可以确定前景图像在背景图像上的准确位置。
  • 透明度处理:如果前景图像包含透明度信息,需要特别处理。只有当像素的透明度为完全不透明时,才将其融合到背景图像上。
  • 边界检查:在将前景图像的像素复制到背景图像之前,需要检查目标位置是否在背景图像的边界内,以避免索引越界错误。

代码改进点:

  • 代码中存在一些逻辑错误,例如 img_alpha 未定义就使用了,这可能是因为代码片段不完整或有遗漏。
  • 对于非透明图像的融合,即使前景图像只有三个通道,代码中的条件判断也是必要的,以确保像素复制不会超出背景图像的边界。

使用场景:

这种类型的图像融合常用于图像编辑、用户界面设计、游戏开发等领域,其中需要将元素(如图标、标签或其他图像)放置到特定位置的场景。

目录
相关文章
|
8月前
|
人工智能 Linux API
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
OpenCV这么简单为啥不学——1.1、图像处理(灰度图、模糊图片、GaussianBlur函数、提取边缘、边缘膨胀、边缘细化)
117 0
|
5月前
|
数据可视化 数据管理 vr&ar
|
6月前
动态人物抠图换背景 MediaPipe
动态人物抠图换背景 MediaPipe
109 0
|
7月前
|
算法 计算机视觉 Python
技术好文共享:计算视觉——图像拼接融合
技术好文共享:计算视觉——图像拼接融合
66 0
|
7月前
|
算法 前端开发 数据建模
图像处理之半调色融合
图像处理之半调色融合
44 0
|
8月前
|
机器学习/深度学习 人工智能 达摩院
DDColor:AI图像着色工具,优秀的黑白图像上色模型,支持双解码器!
DDColor:AI图像着色工具,优秀的黑白图像上色模型,支持双解码器!
427 3
|
8月前
|
物联网 Python
最近被layerdiffusion分层生成透明图像技术刷屏了!
最近被layerdiffusion分层生成透明图像技术刷屏了!
284 1
|
机器学习/深度学习 机器人 vr&ar
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF(1)
照片转视频,像航拍一样丝滑,NeRF原班人马打造Zip-NeRF
374 0
|
监控 算法 vr&ar
鱼眼矫正,实时视频与3D的融合案例分享
#鱼眼摄像头画面矫正及与3D融合 鱼眼摄像头是一种广角镜头,捕捉的视频画面呈现出弯曲或球形。通过鱼眼矫正算法,可以将鱼眼相机拍摄的视频转换为更接近于标准透视的视频,使用户能够直接获得更自然的视频效果。 经过鱼眼矫正后的实时视频,适用于与3D场景实时融合,即视频孪生 = 视频+数字孪生。 视频孪生是现阶段数字孪生的天花板。将分散、割裂的实时视频在数字孪生世界中做三维还原,虚实共生,虚实互补,为用户提供立体、直观、实时真实的动态的系统。只有通过动态的视频,才能实现真正的虚实共生。
444 0
|
机器学习/深度学习 人工智能 算法
给图片悄悄加上像素级水印:防止AI「抄袭」艺术作品的方法找到了
给图片悄悄加上像素级水印:防止AI「抄袭」艺术作品的方法找到了
243 0