opencv2——圖像上的算術運算4


1.圖像算術運算

參數含義:

  • src1:第一張圖像
  • src2:第二張圖像
  • dst:destination,目標圖像,需要提前分配空間,可省略
  • mask:掩膜
  • scale:縮放比,常量
  • dtype:數據類型,默認等於-1
cv2.add(src1,src2,dst,mask,dtype) cv2.subtract(src1,src2,dst,mask,dtype) cv2.multiply(src1,src2,dst,scale,dtype) cv2.divide(src1,src2,dst,scale,dtype)
dst = src1 + src2 dst = src1 - src2 dst = scale * src1 * src2 dst = scale * src1 / src2

 

 

 

 

實例演示:

 1 import cv2
 2 import numpy as np
 3 from matplotlib import pyplot as plt
 4 
 5 x = np.uint8([250])
 6 y = np.uint8([10])
 7 print(cv2.add(x, y))  #飽和運算
 8 print(x + y)   #求余運算(x+y)%255
 9 
10 img1 = cv2.imread('a.jpg')  # 圖片1
11 img2 = cv2.imread('b.jpg')  # 圖片2
12 add = cv2.add(img1, img2)  # 兩個圖像相加
13 subtract = cv2.subtract(img1, img2)  # 兩個圖像相減
14 multiply = cv2.multiply(img1, img2)  # 兩個圖像相乘
15 divide = cv2.divide(img1, img2)  # 兩個圖像相除
16 
17 plt.subplot(231), plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB), 'gray'), plt.title('img1')
18 plt.subplot(232), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB), 'gray'), plt.title('img2')
19 plt.subplot(233), plt.imshow(cv2.cvtColor(add, cv2.COLOR_BGR2RGB), 'gray'), plt.title('add')
20 plt.subplot(234), plt.imshow(cv2.cvtColor(subtract, cv2.COLOR_BGR2RGB), 'gray'), plt.title('subtract')
21 plt.subplot(235), plt.imshow(cv2.cvtColor(multiply, cv2.COLOR_BGR2RGB), 'gray'), plt.title('multiply')
22 plt.subplot(236), plt.imshow(cv2.cvtColor(divide, cv2.COLOR_BGR2RGB), 'gray'), plt.title('divide')
23 plt.show()

 

 

 

 

 

2.圖像混合(線性加法)

這也是加法,不同的是兩幅圖像的權重不同,這會給人一種混合或者透明的感覺。圖像混合的計算公式如下:

g(x) = (1−α)f0 (x)+αf1 (x)
通過修改α的值(0-->1),可以實現很酷的混合。
例:將兩幅圖像混合,第一幅權重為0.7.第二幅權重為0.3。函數cv2.addWeighed()可以按下面的公式對圖片進行混合。
dst = α·img1 + β·img2+γ
這里γ的取值為0

 1 import cv2
 2 import numpy as np
 3 img1=cv2.imread('45.jpg')
 4 img2=cv2.imread('messigray.png')
 5 
 6 dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
 7 
 8 cv2.imshow('dst',dst)
 9 cv2.waitKey(0)
10 cv2.destroyAllWindows()

 

 

 3.按位運算

這里包括按位操作有:AND,OR,NOT,XOR等,當我們提取圖像的一部分,選擇非矩形ROI時,會很有用。下面進行如何改變一幅圖的特定區域。

(1)cv2.bitwise_and(src1,src2,dst,mask)

輸出兩個圖像的交集:dst = src1 & src2

(2)cv2.bitwise_or(src1,src2,dst,mask)

輸出兩個圖像的並集:dst = src1 | src2

(3)cv2.bitwise_not(src,dst,mask)

輸出圖像的非:dst = - src

(4)cv2.bitwise_xor(src1,src2,dst,mask)

輸出兩個圖像的異或:dst = src1 ^ src2

 1 import cv2
 2 import numpy as np
 3 from matplotlib import pyplot as plt
 4 
 5 img1 = cv2.imread('1.jpg')[0:375,0:500]  # 圖片1
 6 img2 = cv2.imread('2.jpg')  # 圖片2
 7 band = cv2.bitwise_and(img1, img2)  # 兩個圖像求交
 8 bor = cv2.bitwise_or(img1, img2)  # 兩個圖像求並
 9 bnot = cv2.bitwise_not(img1)  # 圖像求非
10 bxor = cv2.bitwise_xor(img1, img2)  # 兩個圖像求異或
11 
12 title = ['img1', 'img2', 'and', 'or', 'not', 'xor']
13 images = [img1, img2, band, bor, bnot, bxor]
14 for i in range(6):
15     plt.subplot(2, 3, i+1)
16     plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB), 'gray'), plt.title(title[i])
17 plt.show()

 

 

 


免責聲明!

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



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