Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

简介: Opencv(图像处理)-基于Python-图像的基本运算-给图片加水印

1. 图像运算概念

在计算机的世界里,图像由一个个像素点组成,每个像素点代表一个数字,并且数字的大小代表像素点的颜色,所有像素点的颜色组成了一个图像。因此,使用矩阵可以很好的表示图像。

OpenCV提供的运算方法就是基于矩阵的运算。

2. 图像运算

2.1 add()

将两张图片相加(矩阵的各个像素点分别对应相加)

result = cv2.add(img1,img2)

参数:两张大小完全相同的图片。

返回值计算过后的图片(深拷贝)


把lina图4的左上角部分截取了在图1中,然后与girl图2相加,得到如图3的结果

2.2 substract()

将两个图片做差(矩阵的各个像素点分别对应相减)

result = cv2.subtract(img1,img2)

参数:img1-img2

结果保存在一个新参数中(深拷贝)

图像1和2作差后,亮度降低

部分代码示例:

import cv2
import numpy as np
img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)
# 创建像素点为1的矩阵,并且每个像素点都乘50
img3 = np.ones((185, 185, 3), np.uint8)*100
# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 将两个图像运算
result = cv2.add(img1, region)
# 降低图片的亮度
low_light_result = cv2.subtract(result, img3)
# 展示图片
# cv2.imshow("img1", img1)
# cv2.imshow("img2", img2)
# cv2.imshow("region", region)
cv2.imshow('result', result)
cv2.imshow('img3', img3)
cv2.imshow('low_light_result', low_light_result)
cv2.waitKey(0)

2.3 multiply()/divide()

矩阵乘法(将两个矩阵各个像素点分别相乘)

result = cv2.multiply(img1,img2)

矩阵除法(将两个矩阵的各个像素点分别相除)

result = cv2.divide()

2.4 addWeighted()

图像融合,按权重相加

result = cv2.addWeighted(A,alpha,B,bate,gamma)

参数:alpha:A的权重;bate:B的权重;gamma:静态权重(运算完以后再加gamma)

将图1按0.2,图2按0.8的权重相加得到图3

部分代码展示

import cv2
import numpy as np
img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)
# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 展示图片
cv2.imshow("img1", img1)
cv2.imshow("region", region)
# 图像融合
result = cv2.addWeighted(region, 0.2, img1, 0.8, 0)
cv2.imshow('result', result)
cv2.waitKey(0)

2.5 与/或/非

这里的逻辑运算和我们熟知的其他语言的逻辑运算是一致的。是将矩阵的各个像素点分别进行逻辑运算。

bitwise_and()

图像的按位与运算

result = cv2.bitwise_and(img1,img2)

bitwise_or()

图像的按位或运算

result = cv2.bitwise_or(img1,img2)

bitwise_not()

图像的非运算

result = cv2.bitwise_not(img)

bitwise_xor

图像的按位异或运算(相同为0,相异为1)

result = cv2.bitwise_xor(img1,img2)

部分代码展示

import cv2
import numpy as np
# 创建一个全0图像
img1 = np.zeros((400, 400, 3), np.uint8)
img2 = np.zeros((400, 400, 3), np.uint8)
# 将两幅图部分变成白色
img1[100:200, 100:200] = [255, 255, 255]
img2[150:250, 150:250] = [255, 255, 255]
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
# 位运算
img_and = cv2.bitwise_and(img1, img2)
cv2.imshow('img_and', img_and)
img_or = cv2.bitwise_or(img1, img2)
cv2.imshow('img_or', img_or)
img_not = cv2.bitwise_not(img1)
cv2.imshow('img_not', img_not)
img_xor = cv2.bitwise_xor(img1, img2)
cv2.imshow('img_xor', img_xor)
cv2.waitKey(0)

代码结果如下所示:

3.给一幅图像添加水印

下面将展示给图片添加水印的大致步骤:

  1. 引入一幅图片lina
  2. 要准备一个logo,自己创建
  3. 计算在图片的什么地方添加,把添加的地方变成黑色
  4. 利用add,将logo与图片叠加在一起
import cv2
import numpy as np
img = cv2.imread('./image/lina.jpg')
col, row, chanles = img.shape
# 创建logo
logo = np.zeros((80, 80, 3), np.uint8)
mask1 = np.zeros((80, 80), np.uint8)# 只有一通道,是灰度图
# 画logo
logo[10:40, 10:40] = [0, 0, 255]
logo[30:70, 30:70] = [0, 255, 0]
# 为了将图片中的部分截取下来,把logo的地方给弄黑
mask1[10:40, 10:40] = 255
mask1[30:70, 30:70] = 255
mask1 = cv2.bitwise_not(mask1)
# 截取图像部分
region_img = img[0:80, 0:80]
# 单通道图像与三通道图像运算,智能这样运算。
mask1 = cv2.bitwise_and(region_img, region_img, mask = mask1)
finish_logo = cv2.add(logo, mask1)
# 将处理好的mask1与原图像赋值(添加成功)
img[0:80, 0:80] = finish_logo
cv2.imshow('img', img)
# cv2.imshow('logo', logo)
# cv2.imshow('mask1', mask1)
# cv2.imshow('fin_logo',finish_logo)
cv2.waitKey(0)



以上就是关于图像运算的基本API,难免会有解释不清的地方,有问题欢迎在评论区讨论。

目录
相关文章
|
机器学习/深度学习 存储 数据挖掘
Python图像处理实用指南:PIL库的多样化应用
本文介绍Python中PIL库在图像处理中的多样化应用,涵盖裁剪、调整大小、旋转、模糊、锐化、亮度和对比度调整、翻转、压缩及添加滤镜等操作。通过具体代码示例,展示如何轻松实现这些功能,帮助读者掌握高效图像处理技术,适用于图片美化、数据分析及机器学习等领域。
833 20
|
人工智能 算法 计算机视觉
Python 图像处理技巧
本文介绍了Python图像处理中需要掌握的15个基本技能,涵盖图像读取与保存、颜色空间转换、裁剪与调整大小、滤波与平滑、边缘检测、阈值处理、形态学操作、直方图处理、特征检测与描述、图像配准与特征匹配、轮廓检测与分析、图像分割、模板匹配、透视变换与仿射变换以及傅里叶变换等内容。通过OpenCV、Pillow和Matplotlib等库实现相关功能,为图像处理提供了全面的基础指导。
377 0
|
监控 Java 计算机视觉
Python图像处理中的内存泄漏问题:原因、检测与解决方案
在Python图像处理中,内存泄漏是常见问题,尤其在处理大图像时。本文探讨了内存泄漏的原因(如大图像数据、循环引用、外部库使用等),并介绍了检测工具(如memory_profiler、objgraph、tracemalloc)和解决方法(如显式释放资源、避免循环引用、选择良好内存管理的库)。通过具体代码示例,帮助开发者有效应对内存泄漏挑战。
863 1
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
846 10
|
机器学习/深度学习 算法 数据可视化
Python的计算机视觉与图像处理
本文介绍了Python在计算机视觉和图像处理领域的应用,涵盖核心概念、算法原理、最佳实践及应用场景。重点讲解了OpenCV、NumPy、Pillow和Matplotlib等工具的使用,并通过代码实例展示了图像读写、处理和可视化的方法。实际应用包括自动驾驶、人脸识别、物体检测等。未来趋势涉及深度学习、边缘计算和量子计算,同时也讨论了数据不足、模型解释性和计算资源等挑战。
805 2
|
计算机视觉 开发者 Python
利用Python进行简单的图像处理
【10月更文挑战第36天】本文将引导读者理解如何使用Python编程语言和其强大的库,如PIL和OpenCV,进行图像处理。我们将从基本的图像操作开始,然后逐步深入到更复杂的技术,如滤波器和边缘检测。无论你是编程新手还是有经验的开发者,这篇文章都将为你提供新的视角和技能,让你能够更好地理解和操作图像数据。
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
1195 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
算法 数据可视化 计算机视觉
Python中医学图像处理常用的库
在Python中,医学图像处理常用的库包括:ITK(及其简化版SimpleITK)、3D Slicer、Pydicom、Nibabel、MedPy、OpenCV、Pillow和Scikit-Image。这些库分别擅长图像分割、配准、处理DICOM和NIfTI格式文件、图像增强及基础图像处理等任务。选择合适的库需根据具体需求和项目要求。
826 0
|
11月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
1710 102
|
11月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
526 104

推荐镜像

更多