1.图像的加法
注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from torchvision.transforms.transforms import ToTensor
# 1 读取图像
img1 = cv.imread("opencv_learn\\sky.png")
img2 = cv.imread("opencv_learn\\rain.png")
from torchvision import transforms
my_trans=transforms.Compose([
transforms.ToTensor(),
transforms.RandomResizedCrop(800),
])
print(type(img1))
img1 = my_trans(img1).permute(1,2,0).numpy()
img2 = my_trans(img2).permute(1,2,0).numpy()
# 2 加法操作
img3 = cv.add(img1,img2) # cv中的加法
img4 = img1+img2 # 直接相加
# 3 图像显示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img3[:,:,::-1])
axes[0].set_title("cv中的加法")
axes[1].imshow(img4[:,:,::-1])
axes[1].set_title("直接相加")
plt.show()
2.图像的混合
这其实也是加法,但是不同的是两幅图像的权重不同,这就会给人一种混合或者透明的感觉。图像混合的计算公式如下:
g(x) = (1−α)f0(x) + αf1(x)
通过修改 α 的值(0 → 1),可以实现非常炫酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是0.7,第二幅图的权重是0.3。函数cv2.addWeighted()可以按下面的公式对图片进行混合操作。
dst = α⋅img1 + β⋅img2 + γ
这里γ取为零。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img1 = cv.imread("opencv_learn\\sky.png")
img2 = cv.imread("opencv_learn\\rain.png")
from torchvision import transforms
my_trans=transforms.Compose([
transforms.ToTensor(),
transforms.RandomResizedCrop(800),
])
img1 = my_trans(img1).permute(1,2,0).numpy()
img2 = my_trans(img2).permute(1,2,0).numpy()
# 2 图像混合
img3 = cv.addWeighted(img1,0.7,img2,0.3,0)
# 3 图像显示
plt.figure(figsize=(8,8))
plt.imshow(img3[:,:,::-1])
plt.show()
总结
1. 图像加法:将两幅图像加载一起
cv.add()
2. 图像的混合:将两幅图像按照不同的比例进行混合
cv.addweight()
注意:这里都要求两幅图像是相同大小的。
补充
减法运算 subtract
调用语法:
subtract(src1, src2, dst=None, mask=None, dtype=None)
参数说明:
减法的参数与加法类似:
• src1:作为被减数的图像数组或一个标量
• src2:作为减数的图像数组或一个标量
• dst:可选参数,输出结果保存的变量,默认值为None,如果为非None,输出图像保存到dst对应实参中,其大小和通道数与输入图像相同,图像的深度(即图像像素的位数)由dtype参数或输入图像确
• mask:图像掩膜,可选参数,为8位单通道的灰度图像,用于指定要更改的输出图像数组的元素,即输出图像像素只有mask对应位置元素不为0的部分才输出,否则该位置像素的所有通道分量都设置为0
• dtype:可选参数,输出图像数组的深度,即图像单个像素值的位数(如RGB用三个字节表示,则为24位)。
返回值:相减的结果图像
三、减法运算的四种场景
两个图像矩阵相减, 要求两个矩阵必须有相同大小和通道数
dst(I)=saturate(src1(I)−src2(I))if mask(I)≠0
1个图像矩阵和1个标量相减, 要求src2是标量或者与src1的通道数相同的元素个数,经实际测试应该是一个四元组,如果src1是3通道的,则按通道顺序依次与该四元组的前3个元素相减
dst(I)=saturate(src1(I)−src2)if mask(I)≠0
1个标量和一个图像数组相减, 要求src1是标量或者与src1的通道数相同的元素个数
dst(I)=saturate(src1−src2(I))if mask(I)≠0
在给定值减去矩阵的SubRS情况下,为1个标量和一个图像数组相减的反向差,老猿认为这是第二种场景的一种特殊解读 dst(I)=saturate(src2−src1(I))if mask(I)≠0
示例
img1 = cv2.imread(r'F:\pic\seaside.jpg')
img2 = cv2.imread(r'F:\pic\seaside_new.jpg')
diffImg1 = cv2.subtract(img1,img2)