第二章 图像运算 总结python [opencv]

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)

在这里插入图片描述

标题直接矩阵相减结果

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值