先来看下效果:
【原图】
【我的水印】
【最终效果】
有模有样了是不是?
这里简单解释一下原理或者说是我的思路:
制作这个水印时,我第一反应是使用opencv里面图像重叠混合的操作,通过调整不同的权值可以使图片起到一个透明的效果,从而看起来像是一个水印。这个图像混合的操作,使用的是cv2.addWeight()函数,但使用这个函数有个弊端:加权融合的图片大小尺寸必须相同。一般情况下,水印是比我们的图片小的,所以我们不可能去缩小我们的图片,这会使我们的图片质量降低。但也并非没有办法,那就是从我们的图片中裁剪出一个与水印同样大小的ROI区域,在这个区域内进行图片的加权融合运算,这样就实现了以上的效果。
代码如下:
'''2020.12.03
使用opencv实现两张不同大小的图片的融合,可制作文字和图片水印,只不过这个水印要自己事先准备
'''
import cv2
ori_img = cv2.imread('origin.jpg') #原图
watermark = cv2.imread('watermark.jpg') # 水印
# 根据小图像的大小,在大图像上创建感兴趣区域roi(放置位置任意取)
rows, cols = watermark.shape[:2] #获取水印的高度、宽度
roi = ori_img[0+150:rows+150, 0+150:cols+150] # 加上150是调整加在图片中的某个位置
dst = cv2.addWeighted(watermark,0.15,roi,0.85,0) #图像融合
add_img = ori_img.copy() #对原图像进行拷贝
add_img[0+150:rows+150, 0+150:cols+150] = dst # 将融合后的区域放进原图
cv2.imshow('result',add_img)
cv2.imwrite('result.jpg',add_img) # 保存图片
if cv2.waitKey(0)&0xFF==27: # 按ESC键退出
cv2.destroyAllWindows()