python基于cv2实现给一张图片增加边框

今天遇到一个需求,需要在一张图片上增加一个模板边框。初看这个需求还挺简单的,就是在一张目标图片上覆盖一张边框图嘛。

假如目标图片为

目标图片

覆盖边框图片为

边框图片

使用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()

结果是这样的

结果1

可以看出颜色发生了很大的变化,这并不是我们想要的图片,重新整理以下我们的思路,假设模板边框内部的替换目标图像部分都是白色的(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()

结果如下:

结果2

这样任务就完成了

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

封印水晶

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值