Python OpenCV 给指定文件夹下图片批量添加水印

  • 简述
  • 插件
  • 给单张图片添加水印
  • 遍历文件夹
  • 给指定文件夹下所有满足条件的图片添加水印
  • 效果展示


简述

将主问题分成2个子问题

  • 给图片添加水印
  • 遍历指定文件夹

插件

使用pip安装OpenCV第三方库

pip3 install opencv-python

给单张图片添加水印

这里参考OpenCV_Python图像融合时两张图片大小不一致的解决方法 在较大的图片中创建感兴趣区域roi,roi的大小类型应与另一张图片的相同的方法
这里要注意,水印图片必须比要添加水印的图片小,代码没做判断,有需要自行添加
水印使用png图片
实际使用时修改图片路径即可

读取原图片
img = cv2.imread(“img/img.jpg”)

读取水印图片
mark=cv2.imread(“img/mark.png”)

import cv2

# 读取原图片
img = cv2.imread("img/img.jpg")
h,w = img.shape[0], img.shape[1]
print("原图高:"+str(h)+"原图宽"+str(w))
# 读取水印图片
mark=cv2.imread("img/mark.png")
mark_h,mark_w = mark.shape[0], mark.shape[1]
print("水印高:"+str(mark_h)+"水印宽"+str(mark_w))
# 根据小图像的大小,在大图像上创建感兴趣区域roi(放置位置任意取)
rows, cols = mark.shape[:2] # 获取水印的高度、宽度
# 水印应该在图片的右下角
roi = img[h-mark_h:h,w-mark_w:w] # 获取原图roi
# print(roi.shape[:2]) # 打印roi大小
dst=cv2.addWeighted(mark,1,roi,1,0) # 图像融合
add_img=img.copy() #对原图像进行拷贝
add_img[h-mark_h:h,w-mark_w:w]= dst # 将融合后的区域放进原图
# 保存添加水印后的图片
cv2.imwrite("0.jpg",add_img)

遍历文件夹

os库为python自带,不需要下载
使用时更改路径即可

文件夹路径
traversal_file="/Users/slowfeather/Documents/PythonProject/WaterMark/img"

import os
# 文件夹路径
traversal_file="/Users/slowfeather/Documents/PythonProject/WaterMark/img"
dirs=os.listdir(traversal_file)
for file in dirs:
    file_name=file[:-4] # 去除文件后缀
    if file_name[-1]=="+" : # 当文件名的最后一个字符为+时继续
        print("遍历到"+file)

给指定文件夹下所有满足条件的图片添加水印

里面包含了一个 add_water 方法 用来给图片添加水印
并且在函数一开始对图片的输出路径进行了检测,没有则会自动创建
同样不包含水印大小大于原图大小的判断
水印使用png图片
使用时修改路径即可

所有需要处理的图片的路径
traversal_file="/Users/slowfeather/Documents/PythonProject/WaterMark/img"
添加水印后的图片的路径
watermask_file="/Users/slowfeather/Documents/PythonProject/WaterMark/watermask"
水印图片路径
mark_path="/Users/slowfeather/Documents/PythonProject/WaterMark/img/mark.png"

如果要修改匹配文件条件(最后一个字符为+)可修改代码这个部分

if file_name[-1]=="+" : # 这里判断除去后缀后,文件名最后一个是不是"+"这个字符

import os
import cv2

# 所有需要处理的图片的路径
traversal_file="/Users/slowfeather/Documents/PythonProject/WaterMark/img"
# 添加水印后的图片的路径
watermask_file="/Users/slowfeather/Documents/PythonProject/WaterMark/watermask"
# 水印图片路径
mark_path="/Users/slowfeather/Documents/PythonProject/WaterMark/img/mark.png"

def add_water(img_path,mark_path,save_path):
    # 读取原图片
    img = cv2.imread(img_path)
    h, w = img.shape[0], img.shape[1]
    print("Original h : " + str(h) + "px Original w : " + str(w)+"px")
    # 读取水印图片
    mark = cv2.imread(mark_path)
    mark_h, mark_w = mark.shape[0], mark.shape[1]
    print("watermark h : " + str(mark_h) + "px watermark w : " + str(mark_w)+"px")
    # 根据小图像的大小,在大图像上创建感兴趣区域roi(放置位置任意取)
    rows, cols = mark.shape[:2]  # 获取水印的高度、宽度
    # 水印应该在图片的右下角
    roi = img[h - mark_h:h, w - mark_w:w]  # 获取原图roi
    # print(roi.shape[:2]) # 打印roi大小
    dst = cv2.addWeighted(mark, 1, roi, 1, 0)  # 图像融合
    add_img = img.copy()  # 对原图像进行拷贝
    add_img[h - mark_h:h, w - mark_w:w] = dst  # 将融合后的区域放进原图
    # 保存添加水印后的图片
    cv2.imwrite(save_path+".jpg", add_img)

# 首先检测两个路径是否都可访问,如果水印路径没有则创建
if os.path.isdir(traversal_file):
    print("Check traversal file ok")
else:
    print("Traversal file error")
if os.path.isdir(watermask_file):
    print("Check water mask file ok")
else:
    print("Water mask file warning,auto create it")
    os.mkdir(watermask_file)

# 遍历传入的文件夹,挨个给文件添加水印
dirs=os.listdir(traversal_file)
for file in dirs:
    #print(file[:-4])
    file_name=file[:-4] # 这里裁剪文件后缀.jpg .png
    if file_name[-1]=="+" : # 这里判断除去后缀后,文件名最后一个是不是"+"这个字符
        print(file+" add water marking...")
        add_water(traversal_file+"/"+file,mark_path,watermask_file+"/"+file_name)

效果展示

opencv加时间水印 opencv给视频加水印_文件名


opencv加时间水印 opencv给视频加水印_opencv加时间水印_02