Python OpenCV 给指定文件夹下图片批量添加水印
- 简述
- 插件
- 给单张图片添加水印
- 遍历文件夹
- 给指定文件夹下所有满足条件的图片添加水印
- 效果展示
简述
将主问题分成2个子问题
- 给图片添加水印
- 遍历指定文件夹
插件
使用pip安装OpenCV第三方库
给单张图片添加水印
这里参考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)
效果展示