今天遇到一个需求,需要在一张图片上增加一个模板边框。初看这个需求还挺简单的,就是在一张目标图片上覆盖一张边框图嘛。
假如目标图片为
覆盖边框图片为
使用cv2实现的代码如下
import cv2
ak1=cv2.imread('C:/Users/liuwei/Desktop/face/689406656.jpg');
ak2=cv2.imread('C:/Users/liuwei/Desktop/face/timg.jpg');
h,w,s=ak1.shape
print('高度%d,宽度%d,图层数%d'%(h,w,s))
ak2=cv2.resize(ak2,(w,h),interpolation=cv2.INTER_LINEAR)#两图像补充为一样的大小
#img_add=cv2.addWeighted(ak1,1,ak2,1,0)
img_add=ak1+ak2
cv2.namedWindow("img_add",cv2.WINDOW_NORMAL);
cv2.imshow('img_add',img_add)
cv2.waitKey()
结果是这样的
可以看出颜色发生了很大的变化,这并不是我们想要的图片,重新整理以下我们的思路,假设模板边框内部的替换目标图像部分都是白色的(255,255,255)那么,我们需要将模板图片的白色部分扣除替换为目标文件的像素。我们使用numpy完成我们的计划
import numpy as np
import cv2
ak1=cv2.imread('C:/Users/liuwei/Desktop/face/689406656.jpg');
ak2=cv2.imread('C:/Users/liuwei/Desktop/face/timg.jpg');
h,w,s=ak1.shape
print('高度%d,宽度%d,图层数%d'%(h,w,s))
ak2=cv2.resize(ak2,(w,h),interpolation=cv2.INTER_LINEAR)
b, g, r = cv2.split(ak2)
b_a=np.asarray(b)
g_a=np.asarray(g)
r_a=np.asarray(r)
print(r_a.shape)
print(b_a[0][0])
print(g_a[0][0])
print(r_a[0][0])
mc=np.zeros((h,w))
print(mc.shape)
for i in range(h):
for j in range(w):
mc[i][j]=int(b_a[i][j])+int(g_a[i][j])+int(r_a[i][j])
h,w=mc.shape
avarege=int((np.sum(mc)/(w*h))*0.75)
gatesize=avarege
print(gatesize)
for i in range(h):
for j in range(w):
if mc[i][j]>=gatesize:
ak2[i][j][0]=ak1[i][j][0]
ak2[i][j][1] = ak1[i][j][1]
ak2[i][j][2] = ak1[i][j][2]
cv2.namedWindow("img_add",cv2.WINDOW_NORMAL);
cv2.imshow('img_add',ak2)
cv2.waitKey()
结果如下:
这样任务就完成了