【计算机视觉—python 】 图像处理入门教程 —— 图像之间的加法、标量相加、加权加法、不同尺寸图像加法和两张图渐变切换【 openCV 学习笔记 013 to 017】

1、图像之间加法

cv2.add(src1, src2 [, dst[, mask[, dtype]]) → dst  # 函数说明
  • src1,src2:进行加法运算的图像。
  • dst:输出的图像。
  • mask:掩模图像,8位灰度格式。掩模图像数值为 0 的像素,输出图像对应像素的各通道值也为 0。可选项,默认值为 None。
  • dtype:图像数组深度,即每个像素值的位数,可选项。
  • 返回值:dst,运算结果图像,ndarray多维数组。

注意: cv2.add()两张图片相加,图片大小和通道数必须相同。

OpenCV 加法和 numpy 加法之间有区别:cv2.add() 是饱和运算(相加后如大于 255 则结果为 255),而 Numpy 加法是模运算。

# 图像相加 cv2.add() 与 Numpy 之间对比 
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread("test1.jpg") # 读彩图 1
img2 = cv2.imread("test2.jpg") # 读彩图 2
imgAddCV = cv2.add(img1, img2) # openCV 加法: 饱和运算
imgAddNP = img1 + img2 # Numpy 加法:模运算
# plt.rcParams['font.sans-serif'] = ['FangSong'] # 标签中文设置
plt.subplot(221),plt.title("1. img1"),plt.axis("off")
plt.imshow(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))
plt.subplot(222),plt.title("2. img2"),plt.axis("off")
plt.imshow(cv2.cvtColor(img2,cv2.COLOR_BGR2RGB))
plt.subplot(223),plt.title("3. cv2.add(img1, img2)"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddCV,cv2.COLOR_BGR2RGB))
plt.subplot(224),plt.title("4. img1 + img2 "),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddNP,cv2.COLOR_BGR2RGB))
plt.show()

输出结果:

在这里插入图片描述

2、图像与标量相加

# 测试图像与常数、标量相加结果
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1 = cv2.imread("test1.jpg")
Value = 100 # 设置常数
Scalar1 = np.array([[50., 100., 150.]]) # 标量
Scalar2 = np.ones((1, 3),dtype="float") * Value # 标量
imgAddV =cv2.add(img1, Value) # OpenCV 加法:图像 + 常数
imgAddS1 = cv2.add(img1, Scalar1) # OpenCV 加法:图像 + 标量
imgAddS2 = cv2.add(img1, Scalar2) # OpenCV 加法:图像 + 标量
print("sclar1:",Scalar1)
print("sclar2:",Scalar2)
# 读取原图像随机坐标像素点像素值,相加之后的像素值
for i in range(15,20):
    x, y = i*10, i*10
    print("(x,y)={},{},img1:{},imgAddV:{},imgAddS1:{},imgAddS2:{}".format(x,y,img1[x,y],imgAddV[x,y],imgAddS1[x,y],imgAddS2[x,y]))
# 画图显示
plt.subplot(221),plt.title("1.img1"),plt.axis("off")
plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
plt.subplot(222),plt.title("2.imgAddV"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddV, cv2.COLOR_BGR2RGB))
plt.subplot(223),plt.title("3.imgAddS1"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddS1, cv2.COLOR_BGR2RGB))
plt.subplot(224),plt.title("4.imgAddS2"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddS2, cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

输出结果:

sclar1: [[ 50. 100. 150.]]
sclar2: [[100. 100. 100.]]
(x,y)=150,150,img1:[0 0 0],imgAddV:[100 100 100],imgAddS1:[ 50 100 150],imgAddS2:[100 100 100]
(x,y)=160,160,img1:[0 1 0],imgAddV:[100 101 100],imgAddS1:[ 50 101 150],imgAddS2:[100 101 100]
(x,y)=170,170,img1:[0 1 0],imgAddV:[100 101 100],imgAddS1:[ 50 101 150],imgAddS2:[100 101 100]
(x,y)=180,180,img1:[1 6 4],imgAddV:[101 106 104],imgAddS1:[ 51 106 154],imgAddS2:[101 106 104]
(x,y)=190,190,img1:[2 7 5],imgAddV:[102 107 105],imgAddS1:[ 52 107 155],imgAddS2:[102 107 105]

​ 从结果上看cv2.add()图像和常数相加与图像和标量相加 结果相同,是在B/G/R三个通道上分别加上像素值的结果。

2、图像的加权加法

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst  # 函数说明
  • scr1, scr2:ndarray 多维数组,表示一个灰度或彩色图像
  • alpha:第一张图像 scr1 的权重,通常取为 0~1 之间的浮点数
  • beta:第二张图像 scr2 的权重,通常取为 0~1 之间的浮点数
  • gamma: 灰度系数,图像校正的偏移量,用于调节亮度
  • dtype 输出图像的深度,即每个像素值的位数,可选项,默认等于 src1.depth()
  • 返回值:dst,加权加法运算结果的图像数组 dst = src1 * alpha + src2 * beta + gamma

**注意:**相加的图像大小和通道数需相同

# 图像加权加法 cv2.addWeighted() 用法
import cv2
import matplotlib.pyplot as plt
# 读图
img1 = cv2.imread("test1.jpg") # 读取彩图
img2 = cv2.imread("test2.jpg") # 读取彩图
# 加权融合
imgAddW1 = cv2.addWeighted(img1, 0.2, img2, 0.8, 0)# 加权相加, a = 0.2, b=0.8
imgAddW2 = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)# 加权相加, a = 0.5, b=0.5
imgAddW3 = cv2.addWeighted(img1, 0.8, img2, 0.2, 0)# 加权相加, a = 0.8, b=0.2
# 画图显示
plt.subplot(131), plt.title("1. a=0.2,b=0.8"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddW1,cv2.COLOR_BGR2RGB))
plt.subplot(132), plt.title("2. a=0.5,b=0.5"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddW2,cv2.COLOR_BGR2RGB))
plt.subplot(133), plt.title("3. a=0.8,b=0.2"),plt.axis("off")
plt.imshow(cv2.cvtColor(imgAddW3,cv2.COLOR_BGR2RGB))
plt.show()

在这里插入图片描述

3、不同尺寸的加法相加

# 不同尺寸图像相加用法
import cv2
import numpy as np
imgL = cv2.imread("test1.jpg")
imgS = cv2.imread("test.jpg")

x, y = 300,50 # 叠放位置坐标
W1, H1 = imgL.shape[1::-1] # 大图的位置
W2, H2 = imgS.shape[1::-1] # 小图尺寸

if (x + W2) > W1 : x = W1 - W2 # 调整图像位置,避免溢出
if (y + H2) > H1 : y = H1 - H2 # 调整图像位置,避免溢出
    
imgCrop = imgL[y:y + H2,x:x + W2] # 裁剪大图,与小图 imgs 的大小相同
imgAdd = cv2.add(imgCrop, imgS) # 裁剪图与小图相加
alpha, beta, gamma = 0.2, 0.8, 0.0 # 权值
imgAddW = cv2.addWeighted(imgCrop,alpha,imgS,beta,gamma) # 加权加法与小图叠加
imgAddM = np.array(imgL)
imgAddM[y:y + H2,x: x + W2] = imgAddW # 用叠加小图替换原图 imgL 的叠放位置

cv2.imshow("imgAdd", imgAdd)
cv2.imshow("imgAddW", imgAddW)
cv2.imshow("imgAddM", imgAddM)
cv2.waitKey(0)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、两张图渐变切换

# 两张图像的的渐变切换 (改变加权叠加的权值)
import cv2
import numpy as np
img1 = cv2.imread("test1.jpg")  # 读取图像 imgLena
img2 = cv2.imread("test2.jpg")  # 读取彩色图像(BGR)
wList = np.arange(0.0, 1.0, 0.05)  # start, end, step
for w in wList:
    imgAddW = cv2.addWeighted(img1, w, img2, (1 - w), 0)
    cv2.imshow("imgAddWeight", imgAddW)
    cv2.waitKey(100)
声明:本文是向博主「youcans_」OpenCV例程300篇学习的自用学习笔记 
原文链接:【youcans@qq.com, youcans的OpenCV例程300篇, https://blog.csdn.net/youcans/category_11459626.html】
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值