图像上的算术运算 OpenCV-Python v4.7.0

目标

  • 学习图像上的几种算术运算,如加法、减法、位运算等。
  • 学习这些函数:cv.add(), cv.addWeighted(), 等等。
    图像加法
    你可以用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]

当你添加两张图片时,这将更加明显。坚持使用OpenCV函数,因为它们会提供一个更好的结果。

图像混合

这也是图像添加,但对图像给予不同的权重,以便给人以混合或透明的感觉。图像的添加是按照下面的公式进行的:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g\left( x \right) =\left( 1−\alpha \right) f_0\left( x \right) +\alpha f_1\left( x \right) g(x)=(1α)f0(x)+αf1(x)

通过将α01的变化,你可以在一个图像和另一个图像之间进行很酷的过渡。

这里我取了两张图片来混合。第一张图片的权重为0.7,第二张图片的权重为0.3。cv.addWeighted()对图片应用了以下公式:
d s t = α ⋅ i m g 1 + β ⋅ i m g 2 + γ dst=\alpha ⋅img1+\beta ⋅img2+\gamma dst=αimg1+βimg2+γ

这里的γ被认为是零。

img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

请看下面的结果:
image

位操作

这包括顺时针的AND、OR、NOT和XOR操作。它们在提取图像的任何部分(正如我们将在接下来的章节中看到的那样)、定义和处理非矩形ROI等方面将非常有用。下面我们将看到一个如何改变图像中某一区域的例子。

我想把OpenCV的标志放在一张图片上面。如果我添加两张图片,它将改变颜色。如果我把它们混合起来,我就会得到一个透明的效果。但我希望它是不透明的。如果它是一个矩形区域,我可以像我们在上一章做的那样使用ROI。但是OpenCV的标志不是一个矩形的形状。所以你可以用位操作来做,如下所示:

# 加载两张图片
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 我想把标志放在左上角,所以我创建了一个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中的标志区域涂黑。
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 从标志图像中只提取标志的区域。
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将标志放在ROI中并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

ROI:Region of Interest,感兴趣区域,详情可参见这位博主的文章:

OpenCV中ROI_opencv的roi_无敌三角猫的博客-CSDN博客
https://blog.csdn.net/fightingforcv/article/details/78330872

请看下面的结果。左图是我们创建的遮罩。右图是最终的结果。为了更好地理解,显示上述代码中的所有中间图像,特别是img1_bg和img2_fg。
image

其他资源

练习

使用cv.addWeighted函数创建一个文件夹中图片的幻灯片,并在图片之间平滑过渡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值