基于Python-OpenCV的图片覆盖技术——即把一个图片P到另一个图片上

简介一下前提 : 我所使用的覆盖图片都是已经被抠图的,由于我采用的是网上在线抠图,​​​​​

被抠图图片RGB是黑色RGB——即(0, 0, 0)。

先看一下我们不希望忘得到的结果:很明显被抠除部分显色了/

 再看一下处理后得到的效果 : 

很明显,两张图片完美切合(边缘有点白色,是抠图问题)。下面是实现源码——针对在前提条件下的 所有图片(不过最好是在覆盖图片在被覆盖图片内部的前提下,也就是说,我的实现原理没有考虑到图像像素大小问题)

# 图片覆盖技术

import cv2
import numpy

def addTogether(img_bg : str, img_on : str, location : tuple or list, title=None)->None:
    """
    把被扣图的图片覆盖到一个背景上面
    :param img_bg: 背景图片
    :param img_on: 被扣图图片
    :param location: 覆盖图片的左上角位置
    :param title: 新生成图片的名称
    :return: NONE
    """
    imgbg :numpy.ndarray = cv2.imread(img_bg)
    imgon : numpy.ndarray = cv2.imread(img_on)
    orshape = imgbg.shape
    imgbg[location[0] : location[0] + imgon.shape[0], location[1] : location[1] + imgon.shape[1], :] = imgon

    imgcopy :numpy.ndarray = cv2.imread('img/bg.jpg')
    imgcopy = imgcopy.reshape(-1)
    imgbg = imgbg.reshape(-1)

    where0BG = numpy.where(imgbg == 0)
    imgbg[where0BG] = imgcopy[where0BG]

    imgbg = imgbg.reshape(orshape)

    cv2.imshow(title, imgbg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

addTogether('img/bg.jpg', 'img/1.png', [50, 50])

参数已经在函数接口中说明了,主要介绍一下我的思路  :默认覆盖图片在被覆盖图片内部,审查所有被覆盖图片的黑色RGB位置减去原来黑色RGB位置,这里采用reshape=-1降维是为了更方便处理。

这里啰嗦一句,如果采用传统意义上的cv2.add方法,很大概率会导致原彩图失真——向下图一样(我却觉得这张图蛮有创意的,主要是如何看待效果审美了)。 

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

若您有别的建议,请在评论区留言

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值