基于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方法,很大概率会导致原彩图失真——向下图一样(我却觉得这张图蛮有创意的,主要是如何看待效果审美了)。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码