https://docs.opencv.org/4.2.0/d0/d86/tutorial_py_image_arithmetics.html
目標
- 學習圖像的幾種算術運算,例如加法,減法,按位運算等。
- 學習以下功能: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功能,因為它們會提供更好的結果。
圖像融合
這也是圖像加法,但是對圖像賦予不同的權重,以使其具有融合或透明的感覺。根據以下等式添加圖像:
通過從更改
,您可以在一個圖像到另一個圖像之間執行很酷的過渡。
在這里,我拍攝了兩個圖像,將它們融合在一起。第一幅圖像的權重為0.7,第二幅圖像的權重為0.3。cv.addWeighted()對圖像應用以下公式:
在這里,被視為零。
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徽標不是矩形。因此,您可以按如下所示進行按位操作:
# Load two images
img1 = cv.imread('messi5.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)
mask_inv = cv.bitwise_not(mask)
# 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)
# 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()
請參閱下面的結果。左圖顯示了我們創建的mask。右圖顯示了最終結果。為了獲得更多理解,請顯示上述代碼中的所有中間圖像,尤其是img1_bg和img2_fg。
image
其他資源
練習題
- 使用cv.addWeighted函數在文件夾中創建圖像的幻燈片放映,并在圖像之間平滑過渡