学习Opencv的第七天——Opencv中的算数运算

1、图像加法

可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res = img1 + img2 添加两个图像。两个图像应具有相同的深度和类型,或者第二个图像可以只是一个标量值(这一点学过广播特性的人都了解)

注意: OpenCV加法和Numpy加法之间有区别。OpenCV加法是饱和运算,而Numpy加法是模运算。

可以参考以下示例:

>>> x = np.uint8([250])
>>> y = np.uint8([10])

>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]

>>> print( x+y ) # 250+10 = 260 % 256 = 4
[4]

2、图像融合

这是一种狭义的的图像加法,通过赋予图像不同的权重可以让图像有不同的透明度

​ G(x)= (1 - \alpha ) * f_0(x)+ \alpha * f_1(x)

通过从 \alpha 从 0 ~ 1 更改,可以在一个图像到另一个图像之间执行很酷的过渡。

cv.addWeighted() 在图像上应用以下公式:

dst=\alpha \cdot img1+\beta \cdot img2 + \gamma ,在这里,\gamma 被视为零。

img1 = cv.imread('lena.png')
img2 = cv.imread('logo.png')

# 第一张图片权重为0.7,第二张图片权重为0.3
dst = cv.addWeighted(img1,0.7,img2,0.3,0)

cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

3、按位运算

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

# 加载两张图片
img1 = cv.imread('lena.jpg')
img2 = cv.imread('logo.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, 10, 255, cv.THRESH_BINARY)
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.waitKey(0)
cv.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值