学习图像的几种算术运算,例如加法,减法,按位运算等。
了解以下功能: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−α)f0(x)+αf1(x)
通过变化 α 从 0 → 1,您可以在一个图像到另一个图像之间执行很酷的过渡。
在这里,我拍摄了两个图像,将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()对图像应用以下公式:
dst=α⋅img1+β⋅img2+γ
Here γ is taken as zero.
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()
按位运算
这包括按位AND,OR,NOT和XOR操作。在提取图像的任何部分(如我们将在后续章节中看到),定义和使用非矩形ROI等方面,它们将非常有用。下面我们将看到一个如何更改图像特定区域的示例。 。
我想将OpenCV徽标放在图像上方。如果添加两个图像,它将改变颜色。如果将它们混合,则会获得透明效果。但我希望它不透明。如果是矩形区域,则可以像上一章一样使用ROI。但是OpenCV徽标不是矩形。因此,您可以按如下所示进行按位操作:
import cv2 as cv
import numpy as np
# Load two images
img1 = cv.imread('test.jpeg')
img2 = cv.imread('opencv-logo.png')
# I want to put logo on top-left corner, So I create a ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols]
print("roi is ", roi)
# Now create a mask of logo and create its inverse mask also
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
cv.imshow("mask", mask)
print("mask is ", mask)
mask_inv = cv.bitwise_not(mask)
cv.imshow("mask_inv", mask_inv)
# Now black-out the area of logo in ROI
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# Take only region of logo from logo image.
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
cv.imshow('img2_fg',img2_fg)
# Put logo in ROI and modify the main image
dst = cv.add(img1_bg,img2_fg)
cv.imshow('dst',dst)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()