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

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

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

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

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

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

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

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

# 图片覆盖技术

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方法,很大概率会导致原彩图失真——向下图一样(我却觉得这张图蛮有创意的,主要是如何看待效果审美了)。 

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

 

你可能感兴趣的:(学习,创意,python,opencv)