python-opencv:圖像位運算
1.cv2.add():
函數功能:將兩個圖片進行加和,大於255的使用255計數,需注意兩輸入圖像image1和image2需要有相同的寬/高和通道數。
cv2.add(image1, image2)
參數:
1)img1:圖片對象1
2)img2:圖片對象2
3)mask:None(掩膜,一般用灰度圖做掩膜,img1和img2相加後,和掩膜與運算,從而達到掩蓋部分區域的目的;)
4)dtype:-1
2.cv2.addWeighted():
函數功能:將兩個圖片加權疊加,需注意兩輸入圖像image1和image2需要有相同的寬/高和通道數。
cv2.addWeighted()
參數:
1)img1:圖片對象1
2)alpha:img1的權重
3)img2:圖片對象2
4)beta:img1的權重
5)gamma:常量值,圖像相加後再加上常量值
6)dtype:返回圖像的數據類型,默認爲-1,和img1一樣
(img1*alpha+img2*beta+gamma)
3.cv2.btwise_and():
函數功能:兩圖像按位與操作,兩個輸入圖像需要有相同的形狀。
經常看到的result = cv2.btwise_and(img1, img1,mask)的操作相當於對img1l保留mask部分,其餘部分置0。
cv2.btwise_and():
參數:
1)img1:圖片對象1
2)img2:圖片對象2
3)mask:掩膜
4.cv2.btwise_and():
函數功能:兩圖像按位或操作,兩個輸入圖像需要有相同的形狀。
cv2.bitwise_or():
參數:
1)img1:圖片對象1
2)img2:圖片對象2
3)mask:掩膜
5.cv2.btwise_xor():
函數功能:異或運算,相同爲1,不同爲0。
cv2.bitwise_xor()
參數:
1)img1:圖片對象1
2)img2:圖片對象2
3)mask:掩膜
6.cv2.btwise_not():
函數功能:非運算,對輸入圖像按位取反。
cv2.bitwise_not(): 非運算
參數:
1)img1:圖片對象1
2)mask:掩膜
7.如何對不同尺寸的圖像進行疊加操作:
import cv2
import numpy as np
import matplotlib.pylab as plt
# 引入兩個圖片,第二個是logo
img1 = cv2.imread('data/2.jpg')
img2 = cv2.imread('data/maskFace.jpg')
plt.subplot(231),plt.imshow(img1)
plt.subplot(232),plt.imshow(img2)
# 設定圖1的roi,注意:對roi的操作就是對img1的操作
r1,c1,ch1 = img1.shape
r2,c2,ch2 = img2.shape
# roi確定了圖2所在圖1的位置
roi = img1[r1-r2:r1, c1-c2:c1 ]
# 圖2(logo)轉換爲灰度圖
gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
# 對圖2閾值分割得到mask1(獲取0~100部分)
# 保留mask1部分的roi
ret, mask1 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV)
fg1 = cv2.bitwise_and(roi,roi,mask=mask1)
plt.subplot(233),plt.imshow(fg1)
plt.subplot(234),plt.imshow(mask1)
# 對圖2圖2閾值分割得到mask2(獲取100~255部分)
# 保留mask2部分的img2
ret, mask2 = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
# 保留img2的logo背景部分
fg2 = cv2.bitwise_and(img2,img2,mask = mask2)
plt.subplot(235),plt.imshow(fg2)
# 圖像疊加
roi[:] = cv2.add(fg1, fg2)
plt.subplot(236),plt.imshow(img1)
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()