目标
- 在图像上学习几种算术运算,如加法,减法,按位运算等。
- 您将学习这些函数:cv.add(),cv.addWeighted()等
图像添加
您可以通过OpenCV函数cv.add()进行两个图像的加法,或者简单地通过numpy操作res = img1 + img2 进行两个图像相加。当然两张图片应该具有相同的深度和类型,或者第二张图片是标量值。
程序:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
x = np.uint8([250])
y = np.uint8([10])
print( cv.add(x,y) )
print( x+y )
x1 = np.uint8([20])
y1 = np.uint8([10])
print( cv.add(x1,y1) )
print( x1+y1)
对两张图像进行加法时,效果会更明显。OpenCV函数将提供更好的结果。所以最好坚持使用OpenCV函数。
图像混合
这个其实也是图像的加法,但是不同的是图像被赋予不同的权重,以便给出混合或透明的感觉。图像按照以下公式添加:
通过从改变α(0→1),你可以实现一个很酷的转换。
在这里,我拍摄了两张图像,并将它们融合在一起。第一幅图像的权重为0.7,第二幅图像的权重为0.3。cv.addWeighted()在图像上应用以下等式。
其中的γ的值为零。
程序:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
row,col,channel=img1.shape
print(img1.shape)
img2=img2[:row,:col]
print(img2.shape)
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
from matplotlib import pyplot as plt
# Load two images
img1 = cv.imread('lena.jpg')
img2 = cv.imread('opencv-logo-white.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 = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
#cv.imshow('mask',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)
cv.imshow('img1_bg',img1_bg)
# 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)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
结果: