opencv入門系列教學(六)圖像上的算術運算(加法、融合、按位運算)


0.序言

這一篇博客我們將學習圖像的幾種算術運算,例如加法,減法,按位運算等。

1.圖像加法

我們可以通過OpenCV函數 

cv.add()

或僅通過numpy操作

res=img1+img2 

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]

2.圖像融合

這是一種更為常用的圖像加法操作,但是對圖像賦予不同的權重,這個操作可以用來對兩幅圖像或兩段視頻產生時間上的 畫面疊化 (cross-dissolve)效果,就像在幻燈片放映和電影制作中那樣,以使其具有融合或透明的感覺。根據以下等式添加圖像:

cv.addWeighted() 

其數學表達式為G(x) = α · img1 +  (1-α)img2 ,其中 α 取值0 - 1。

下面我們將兩個圖像並且融合在一起。第一幅圖像的權重為0.7,第二幅圖像的權重為0.3。

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()

 結果如下所示:

 

 

3.按位運算


按位運算包括按位 AND 、 OR 、 NOT 和 XOR 操作。它們在提取圖像的任何部分(我們將在后面的章節中看到)、定義和處理非矩形 ROI 等方面非常有用。 下面我們將看到一個例子,如何改變一個圖像的特定區域。

考慮下面這種情況,我想把 OpenCV 的標志放在一個圖像上面。如果我添加兩個圖像,它會改變顏色。如果我混合它,我得到一個透明的效果。但我希望它是不透明的。如果是一個矩形區域,我可以使用 ROI,就像我們在上一章中所做的那樣。但是 OpenCV 的 logo 不是長方形的。所以我們可以使用如下的按位操作來實現:

# 加載兩張圖片
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 我想把logo放在左上角,所以我創建了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中logo的區域塗黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 僅從logo圖像中提取logo區域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 將logo放入ROI並修改主圖像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()

請看下面的結果。左圖顯示了我們創建的掩膜mask。右圖顯示最終結果。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM