在寫該文之前,老猿就影象的一些運算已經單獨邊學邊發了,在寫這些文的過程中,發現這些運算函數共同點很多,例如大部分引數一樣、部分處理方法一樣等,另外還有些函數可以實現相同或近似的效果,因此在前面那些文章的基礎上,將其綜合為一個整體來發布,更方便大家閱讀。
OpenCV中影象儲存為矩陣,因此影象的運算其實就是矩陣的運算。影象的運算主要包括影象基礎算術運算、影象加權運算(又稱為影象融合)、按位元運算等類別。這些運算可以直接通過numpy矩陣進行,也可以通過opencv的專用方法進行,但opencv的矩陣運算和numpy矩陣運算還是有些不同。例如在加法處理上,OpenCV加法是飽和運算(超過255即按255),而Numpy加法是模運算(超過255按256取模的結果作為結果,好多)。對加法來說,顏色值越大OpenCV 的結果會更好,因此推薦使用opencv的進行算術運算。本文的內容全部基於OpenCV的方法進行介紹。
OpenCV影象運算包括如下函數:
add(src1, src2, dst=None, mask=None, dtype=None)
subtract(src1, src2, dst=None, mask=None, dtype=None)
multiply(src1, src2, dst=None, scale=None, dtype=None)
divide(src1, src2, dst=None, scale=None, dtype=None)
pow(src, power, dst=None)
sqrt(src, dst=None)
exp(src, dst=None)
log(src, dst=None)
addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
bitwise_and(src1, src2, dst=None, mask=None)
bitwise_or(src1, src2, dst=None, mask=None)
bitwise_xor(src1, src2, dst=None, mask=None)
bitwise_not(src, dst=None, mask=None)
def main():
img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
img2 = cv2.imread(r'F:\pic\shape2.png')
img = cv2.add(img1,img2,dtype=24)
上述程式碼將以兩種不同表示方法讀入兩副影象,第一幅影象是以float32來表示影象單通道值,第二幅影象是預設值uint8來表示影象單通道值,二者機器位數不同,但相加之後轉為了24位元影象,即單通道為8位元組影象。
針對部分重要的影象運算,老猿在前面已經單獨進行了介紹,包括:
冪運算:pow(src, power, dst=None)
,對影象的每個通道值計算power引數對應的冪作為結果影象的通道值,如果power為整數,則直接計算冪值,如果power為浮點數,則取通道值的絕對值參與計算,即:
開方運算:sqrt(src, dst=None)
,對影象的每個通道值開方作為結果影象的通道值,即:dst(I)=sqrt(src1(I))
自然常數e為底的指數函數:exp(src, dst=None)
,以e為底對影象的每個通道值作為冪值計算結果影象的通道值,即:
對數運算:log(src, dst=None)
,計算影象的每個通道值的自然對數作為結果影象的通道值,即:dst(I)=ln(src(I))
位或運算:bitwise_or(src1, src2, dst=None, mask=None)
,計算兩副影象每個通道值或一影象通道值與一個標量的按位元或的結果作為結果影象的通道值
位互斥或運算:bitwise_xor(src1, src2, dst=None, mask=None)
,計算兩副影象每個通道值或一影象通道值與一個標量的按位元互斥或的結果作為結果影象的通道值
位非運算:bitwise_not(src, dst=None, mask=None)
,將src影象的每個通道值按位元取反作為結果影象的值。
前面部分影象運算函數詳解中舉例介紹了影象加減乘除權重加及位與的相關功能,在此補充一個簡單的按位元運算的案例。程式碼如下:
import numpy as np
import cv2
def main():
img1 = cv2.imread(r'F:\pic\shape1.png').astype(np.float32)
img2 = cv2.imread(r'F:\pic\shape2.png')
resultImgAnd = cv2.bitwise_and(img1, img2)
resultImgOr = cv2.bitwise_or(img1, img2)
resultImgXor = cv2.bitwise_xor(img1, img2)
resultImgNot = cv2.bitwise_not(img1)
resultImgXorScalar = cv2.bitwise_xor(img1, (255,255,255,255))
cv2.imshow('img1',img1)
cv2.imshow('img2', img2)
cv2.imshow('resultImgAnd', resultImgAnd)
cv2.imshow('resultImgOr', resultImgOr)
cv2.imshow('resultImgXor', resultImgXor)
cv2.imshow('resultImgNot', resultImgNot)
cv2.imshow('resultImgXorScalar', resultImgXorScalar)
cv2.waitKey(0)
main()
執行顯示的圖片截圖:
本文詳細介紹了OpenCV-Python影象的加減乘除冪開方對數及位運算相關的函數及語法,並總結了相關函數的作用。OpenCV中影象儲存為矩陣,因此影象的運算其實就是矩陣的運算。影象的運算主要包括影象基礎算術運算、影象加權運算(又稱為影象融合)、按位元運算等類別。這些運算可以直接通過numpy矩陣進行,也可以通過opencv的專用方法進行,但opencv的矩陣運算是飽和運算,其運算效果比純粹的矩陣運算效果更好。
更多OpenCV-Python介紹請參考專欄《OpenCV-Python圖形影象處理 》
專欄網址:https://blog.csdn.net/laoyuanpython/category_9979286.html
老猿的付費專欄《使用PyQt開發圖形介面Python應用 》(https://blog.csdn.net/laoyuanpython/category_9607725.html)專門介紹基於Python的PyQt圖形介面開發基礎教學,付費專欄《moviepy音視訊開發專欄》 (https://blog.csdn.net/laoyuanpython/category_10232926.html)詳細介紹moviepy音視訊剪輯合成處理的類相關方法及使用相關方法進行相關剪輯合成場景的處理,兩個專欄都適合有一定Python基礎但無相關知識的小白讀者學習。
付費專欄文章目錄:《moviepy音視訊開發專欄文章目錄》(https://blog.csdn.net/LaoYuanPython/article/details/107574583)、《使用PyQt開發圖形介面Python應用專欄目錄 》(https://blog.csdn.net/LaoYuanPython/article/details/107580932)。
對於缺乏Python基礎的同仁,可以通過老猿的免費專欄《專欄:Python基礎教學目錄》(https://blog.csdn.net/laoyuanpython/category_9831699.html)從零開始學習Python。
如果有興趣也願意支援老猿的讀者,歡迎購買付費專欄。