OpenCV图像的算术运算

目标

  • 学习图像上的几个算术运算,如加法、减法、位运算等。
  • 您将学习以下功能:cv2.add()cv2.addWeighted()

图像加法

您可以通过OpenCV函数添加两幅图像,cv2.add()或者只是简单的操作res = img1 + img2。这两个图像都应该具有相同的深度和类型,或者第二个图像可以只是一个标量值。

注:OpenCV加法和Numpy加法有区别。OpenCV加法是一种饱和运算,而Numpy加法是一种模块化运算。

例如,考虑下面的示例:

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

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

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

当您添加两个图像时,它将更加可见。OpenCV函数将提供更好的结果。所以最好还是坚持OpenCV函数。

图像混合

这也是图像加法,但不同的权重被赋予图像,以便它给人一种混合或透明的感觉。图像按以下公式添加:

g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

变幻\alpha从…0 \rightarrow 1,您可以在一个图像到另一个图像之间执行一个很酷的转换。这里有两张照片,把它们混在一起。第一图像的权重为0.7,第二图像的权重为0.3。cv2.addWeighted()在图像上应用以下等式。

dst = \alpha \cdot img1 + \beta \cdot img2 + \gamma

这里\gamma等于零。

img1 = cv2.imread('ml.png')
img2 = cv2.imread('opencv_logo.jpg')

dst = cv2.addWeighted(img1,0.7,img2,0.3,0)

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

检查结果如下:

按位操作

这包括按位AND、OR、NOT和XOR操作。在提取图像的任何部分、定义和使用非矩形ROI等时,它们将非常有用。下面我们将看到一个如何改变图像的特定区域的例子。

我想把OpenCV标志放在图片上方。如果我添加两个图像,它将改变颜色。如果我把它混在一起,我就能得到透明的效果。但我希望它是不透明的。如果是矩形区域,我可以像上一章那样使用ROI。但是OpenCV标志不是长方形的。因此,您可以使用按位操作,如下所示:

# Load two images
img1 = cv2.imread('messi5.jpg')
img2 = cv2.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 ]

# Now create a mask of logo and create its inverse mask also
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# Now black-out the area of logo in ROI
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

# Take only region of logo from logo image.
img2_fg = cv2.bitwise_and(img2,img2,mask = mask)

# Put logo in ROI and modify the main image
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst

cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

见下面的结果。左边的图片显示了我们创建的面具。右图像显示最终结果。

猜你喜欢

转载自blog.csdn.net/rongpeisheng666/article/details/81607175