OpenCV学习——图像上的算术运算

本文介绍了如何使用OpenCV进行图像的加法、融合和按位运算。通过cv.add()和cv.addWeighted()函数实现了图像的加法与融合,展示了如何通过调整权重实现图像之间的平滑过渡。此外,还详细解释了按位运算在图像处理中的应用,特别是在不规则形状遮罩下的图像叠加,通过按位AND、OR、NOT和XOR操作实现不透明的图像叠加效果。
摘要由CSDN通过智能技术生成

学习目标:

学习图像的几种算术运算,例如加法,减法,按位运算等。
学习功能:cv.add,cv.addWeighted等。

图像加法

可以通过OpenCV函数cv.add()或仅通过numpy操作res = img1 + img2添加两个图像。两个图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值。
注意 OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。

import numpy as np
import cv2 as cv
x = np.uint8([250])
y = np.uint8([10])
cv.add(x, y)
array([[255]], dtype=uint8)

255是饱和值

x + y
array([4], dtype=uint8)

250+10=260%256=4

当添加两个图像时,将会更加可见。OpenCV功能将提供更好的结果。因此,始终最好坚持使用OpenCV功能。

图像融合

这也是图像加法,但是对图像赋予不同的权重,以使其具有融合或透明的感觉。根据以下等式添加图像:
在这里插入图片描述
通过从 α 从 0→1 更改,您可以在一个图像到另一个图像之间执行很酷的过渡。
在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()在图像上应用以下公式:
在这里插入图片描述
在这里,r 被视为零。

img1 = cv.imread('img/2.jpg')
img2 = cv.imread('img/OpenCV.png')![在这里插入图片描述](https://img-blog.csdnimg.cn/099433b8598040d88054331aead53718.png)

dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

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

在这里插入图片描述

按位运算

这包括按位 AND、 OR、NOT 和 XOR 操作。它们在提取图像的任何部分(我们将在后面的章节中看到)、定义和处理非矩形 ROI 等方面非常有用。 下面我们将看到一个例子,如何改变一个图像的特定区域。 我想把 OpenCV 的标志放在一个图像上面。如果我添加两个图像,它会改变颜色。如果我混合它,我得到一个透明的效果。但我希望它是不透明的。如果是一个矩形区域,我可以使用 ROI,就像我们在上一章中所做的那样。但是 OpenCV 的 logo 不是长方形的。所以你可以使用如下的按位操作来实现:
我想在图像上方放置OpenCV徽标。如果添加两个图像,它将改变颜色。如果混合它,我将获得透明效果。但我希望它不透明。如果是矩形区域,则可以像上一章一样使用ROI。但是OpenCV徽标不是矩形。因此,您可以按如下所示进行按位操作:

# 加载两张图片
img1 = cv.imread('img/2.jpg')
img2 = cv.imread('img/OpenCV.png')
# 我想把logo放在左上角,所以我创建了ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 现在创建logo的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 150, 255, cv.THRESH_BINARY_INV)
mask_inv = cv.bitwise_not(mask)
# 现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.imwrite('img/opencv_b.png', img1)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
关于OpenCV中关于二值化处理可以查阅
OpenCV学习——图像二值化处理及二维傅里叶变换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨小古

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值