Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果
目录
[Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果](#Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十二 简单图片添加水印效果)
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
二、简单图片添加水印效果实现原理
给图片添加水印是指在图片上叠加额外的标识、文字、图形或者其他图像,以表明该图片的归属、来源、版权信息或者其他附加信息的过程。水印通常以半透明的方式显示在图片的某个位置,可以防止未经授权的复制和使用,并且可以提升图片的专业性和美观度。添加水印的过程可以通过图像处理技术来实现,包括图像叠加、透明度调整、文字绘制等。
添加文字水印 (
add_watermark_text
):
- 原理:在原始图像上绘制指定的文字,作为水印。
- 实现方法:使用 OpenCV 的
cv2.putText()
函数在图像上添加文字。添加图片水印 (
add_watermark_image
):
- 原理:将水印图片叠加到原始图像的指定位置。
- 实现方法:将水印图片的 BGR 通道与原始图像的相应区域进行叠加,同时考虑水印图片的 alpha 通道,控制水印的透明度。
涉及的一些函数说明:
cv2.putText():
- 函数功能:在图像上绘制文本。
- 参数:
image
:要绘制文本的图像。text
:要绘制的文本内容。org
:文本的起始坐标,即文本左下角的坐标。font
:字体类型,默认为cv2.FONT_HERSHEY_SIMPLEX
。font_scale
:字体缩放因子。font_color
:文本颜色,格式为 BGR。thickness
:文本线条粗细。- 返回值:无。
- 注意事项:根据
org
参数确定文本的起始位置,确保文本不会超出图像范围。Array slicing (数组切片):
- 函数功能:用于在图像上获取指定位置的子图像。
- 参数:用于指定图像区域的坐标和大小。
- 返回值:返回指定区域的子图像。
- 注意事项:确保指定的区域不会超出图像范围。
cv2.addWeighted():
- 函数功能:对两个图像进行加权求和,实现图像叠加效果。
- 参数:
src1
:第一个输入图像。alpha
:第一个输入图像的权重。src2
:第二个输入图像。beta
:第二个输入图像的权重。gamma
:结果图像的亮度值,添加到加权和上。- 返回值:返回加权和后的图像。
- 注意事项:通过调整
alpha
和beta
参数可以控制两个图像的显示比例,通过gamma
参数可以调整结果图像的亮度。
三、简单图片添加水印效果案例实现简单步骤
1、编写代码
2、运行效果
3、具体代码
python
"""
简单图片添加水印效果
"""
import cv2
def add_watermark_text(image, text, position='bottom-right', x=None, y=None, font=cv2.FONT_HERSHEY_SIMPLEX,
font_scale=1.0, font_color=(255, 255, 255), thickness=1):
"""
简单添加文字水印效果
:param image:
:param text:
:param position:
:param x:
:param y:
:param font:
:param font_scale:
:param font_color:
:param thickness:
:return:
"""
# 复制原始图像,以免修改原始图像
result = image.copy()
# 确定水印文本的位置
text_size, _ = cv2.getTextSize(text, font, font_scale, thickness)
image_height, image_width = image.shape[:2]
if position == 'top-left':
text_position = (10, text_size[1] + 10)
elif position == 'top-right':
text_position = (image_width - text_size[0] - 10, text_size[1] + 10)
elif position == 'bottom-left':
text_position = (10, image_height - 10)
elif position == 'center':
text_position = ((image_width - text_size[0]) // 2, (image_height + text_size[1]) // 2)
else: # 默认为 'bottom-right'
text_position = (image_width - text_size[0] - 10, image_height - 10)
# 如果用户指定了位置,则使用用户指定的位置
if x is not None and y is not None:
text_position = (x, y)
# 添加水印文本
cv2.putText(result, text, text_position, font, font_scale, font_color, thickness)
return result
def add_watermark_image(image, watermark_image, position='bottom-right', x=None, y=None):
"""
简单添加图片水印效果
:param image:
:param watermark_image:
:param position:
:param x:
:param y:
:return:
"""
# 复制原始图像,以免修改原始图像
result = image.copy()
# 确定水印图片的位置
watermark_height, watermark_width = watermark_image.shape[:2]
image_height, image_width = image.shape[:2]
if position == 'top-left':
watermark_position = (0, 0)
elif position == 'top-right':
watermark_position = (image_width - watermark_width, 0)
elif position == 'bottom-left':
watermark_position = (0, image_height - watermark_height)
elif position == 'center':
watermark_position = ((image_width - watermark_width) // 2, (image_height - watermark_height) // 2)
else: # 默认为 'bottom-right'
watermark_position = (image_width - watermark_width, image_height - watermark_height)
# 如果用户指定了位置,则使用用户指定的位置
if x is not None and y is not None:
watermark_position = (x, y)
# 获取水印图片的 alpha 通道
watermark_alpha = watermark_image[:, :, 3] / 255.0
# 提取水印图片的 BGR 通道
watermark_bgr = watermark_image[:, :, :3]
# 将水印图片叠加到原始图像上
for c in range(3):
result[watermark_position[1]:watermark_position[1] + watermark_height,
watermark_position[0]:watermark_position[0] + watermark_width, c] = \
(1 - watermark_alpha) * result[watermark_position[1]:watermark_position[1] + watermark_height,
watermark_position[0]:watermark_position[0] + watermark_width, c] + \
watermark_alpha * watermark_bgr[:, :, c]
return result
def main():
# 调用函数并指定输入图像、水印和输出图像文件路径
input_image_path = "Images/DogFace.jpg"
watermark_path = "Images/Watermark.png"
output_image_path = "Images/DogFace_Watermark.jpg"
image = cv2.imread(input_image_path)
# 设置窗口属性,并显示图片
cv2.namedWindow("Dog", cv2.WINDOW_KEEPRATIO)
cv2.imshow('Dog', image)
output_image = add_watermark_text(image, "Water mark", x=200, y=300, font_scale=2.0, thickness=2)
# 保存处理后的图像
# 设置窗口属性,并显示图片
cv2.namedWindow("add_watermark_text", cv2.WINDOW_KEEPRATIO)
cv2.imshow("add_watermark_text", output_image)
watermark = cv2.imread(watermark_path, cv2.IMREAD_UNCHANGED)
output_image = add_watermark_image(image, watermark, position="center")
# 保存处理后的图像
# 设置窗口属性,并显示图片
cv2.namedWindow("add_watermark_image", cv2.WINDOW_KEEPRATIO)
cv2.imshow("add_watermark_image", output_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
四、注意事项
1、确保水印文本位置不会超出图像范围,可以根据指定的位置参数调整水印的位置。
2、考虑水印图片的 alpha 通道,以防止水印添加后出现黑色边框或不透明度不一致的情况。
3、可以根据需要调整水印图片的显示位置和透明度参数。